日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDFS分析(二)

發布時間:2024/6/14 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDFS分析(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

HDFS中簡單的分為:Client,DataNode,NameNode三大類,其中他們之間的通訊一共有這么幾種:

Client <=====>NameNode;Client <=====>DataNode;NameNode <======>DataNode;DataNode<=====>DataNode幾種,其中涉及到很多網絡通訊的封裝,也涉及到Hadoop的IPC機制。

? ?他們的通訊如下:

?

? ?主要類的類圖:

?

?HDFS的通訊方面的代碼寫的不是很優雅,相互依賴太多,只有一點點進行分析

?

總體

DFSClient與NameNode的通訊使用了Hadoop自身的ipc通訊機制,ipc機制使用了Hadoop自身的IO和序列化方式,沒有使用JDK自身的序列化方式
是因為JDK自身的序列化方式過于重量效率不高

?

NameNode和Datanode都是最頂層的接口VersionedProtocol,實現了該接口就表示這個類將使用Hadoop的RPC機制

?

Hadoop RPC結構分為Server,Client,以及協議接口和實現

?

RPC是對外的接口,主要提供了getServer()和getProxy()方法,getServer()為指定協議創建服務器端的實例,在指定的地址和端口上啟動服務

getProxy()創建了一個指定協議的服務器端實例的代理

?

Server端:
ipc.Server類代碼比較復雜,內部類比較多,Server處理網絡方面使用了NIO Reactor模式

ipc.Server.Listener:服務器端的監聽類,監聽來自客戶端的連接請求,以及為ipc.Server.Listener.Reader注冊讀事件,創建ipc.Server.Connection實例


ipc.Server.Listener.Reader:ipc.Server.Listener為Reader注冊了讀事件,Reader讀取客戶端過來的數據,當讀滿一個RPC的請求數據的時候處理這些數據生成一個ipc.Server.Call實例,這個實例放入server的BlockingQueue中。


ipc.Server.Handler:一直監聽著server的BlockingQueue,如果Reader把Call實例加入的話,Handler從隊列里面取出,使用JDK的反射執行相關的方法,
執行完后交有Responder設置Call的response,然后寫回給客戶端,Responder同步的寫回客戶端的一個Call的response,其他的Call的結果將有Responder異步寫回

基本的類圖和流程如下:

?

?

Client端:

先看相關的類圖:

Client:客戶端的實現類
Client.ConnectionId:到RPC服務端對象連接的標識
Client.Connection:到RPC服務端的連接,由Client.ConnectionId進行唯一標識,放在Client的鏈接池里面
Client.Call:存儲客戶端的調用參數,以及服務器端后續返回的參數
RPC.Invoker:對InvocationHandler的實現,提供invoke方法,截獲RPC客戶端對RPC服務端對象的調用


客戶端調用的大致流程是:

1.RPC類的getProxy()最終是調用JDK動態代理的方法創建一個VersionedProtocol或者其子接口的代理類,在此創建了InvocationHandler的實現RPC.Invoker的實例
2.在Invoker構造方法中創建Client.ConnectionId,以及根據SocketFactory獲得對應的Client實例
3.當客戶端調用一個服務器端的方法時,Invoker的invoke方法被調用,invoke方法執行client的call方法
4.Client的call方法中創建了Client.Call實例,獲得Client.Connection實例(從連接池中獲得或者新建一個,當是新建的一個Connection時,先和服務器端進行連接,
然后寫入rpcHeader和ConnectionHeader,從連接池中獲得的是不需要設置的),其他還有如Connection的回收這里不表
5.在第4步之后,在connection中寫入實際要調用的數據
6.Connection是個線程,在run方法中是同步等待服務器端的返回
7.call實例設置value,返回給調用者

?


最后給個client和server之間調用示意圖:

轉載于:https://www.cnblogs.com/nod0620/archive/2012/03/27/2417760.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的HDFS分析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。