Hadoop 源代碼分析(六)RPC-Client

既然是RPC,天然就有客戶端和服務器,固然,org.apache.hadoop.rpc 也就有了類Client 和類Server。在這裏咱們來仔細考
察org.apache.hadoop.rpc.Client。下面的圖包含了org.apache.hadoop.rpc.Client 中的關鍵類和關鍵方法。
因爲Client 可能和多個Server 通訊,典型的一次HDFS 讀,須要和NameNode 打交道,也須要和某個/某些DataNode 通訊。這
就意味着某一個Client 須要維護多個鏈接。同時,爲了減小沒必要要的鏈接,如今Client 的作法是拿ConnectionId(圖中最右
側)來作爲Connection 的ID。ConnectionId 包括一個InetSocketAddress(IP 地址+端口號或主機名+端口號)對象和一個用
戶信息對象。這就是說,同一個用戶到同一個InetSocketAddress 的通訊將共享同一個鏈接。
 

鏈接被封裝在類Client.Connection 中,全部的RPC 調用,都是經過Connection,進行通訊。一個RPC 調用,天然有輸入參數,
輸出參數和可能的異常,同時,爲了區分在同一個Connection 上的不一樣調用,每一個調用都有惟一的id。調用是否結束也須要
一個標記,全部的這些都體如今對象Client.Call 中。Connection 對象經過一個Hash 表,維護在這個鏈接上的全部Call:
Java 代碼
1. private Hashtable<Integer, Call> calls = new Hashtable<Integer, Call>();
一個RPC 調用經過addCall,把請求加到Connection 裏。爲了可以在這個框架上傳輸Java 的基本類型,String 和Writable 接
口的實現類,以及元素爲以上類型的數組,咱們通常把Call 須要的參數打包成爲ObjectWritable 對象。
Client.Connection 會經過socket 鏈接服務器,鏈接成功後回校驗客戶端/服務器的版本號(Client.ConnectionwriteHeader()方
法),校驗成功後就能夠經過Writable 對象來進行請求的發送/應答了。注意,每一個Client.Connection 會起一個線程,不斷
去讀取socket,並將收到的結果解包,找出對應的Call,設置Call 並通知結果已經獲取。
Call 使用Obejct 的wait 和notify,把RPC 上的異步消息交互轉成同步調用。
還有一點須要注意,一個Client 會有多個Client.Connection,這是一個很天然的結果。web

相關文章
相關標籤/搜索