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年技術見證,附贈技術全景圖總結
- 上一篇: RabbitMQ introductio
- 下一篇: 吃饱了,就来写点东西吧。讲一个真实的故事