Hadoop實戰-中高階部分 之 Hadoop RPC

sufeizi發表於2013-12-09
Hadoop RestFul
Hadoop HDFS原理1
Hadoop HDFS原理2
Hadoop作業調優引數調整及原理
Hadoop HA
Hadoop MapReduce高階程式設計
Hadoop IO
Hadoop MapReduce工作原理
Hadoop 管理
Hadoop 叢集安裝
Hadoop RPC
 
第一部分:什麼是RPC
         RPC (Remote Procedure Call Protocol)  遠端過程協議呼叫 。通過 RPC 我們可以從網路上的計算機請求服務,而不需要了 解底層網路協議。 Hadoop 底層的互動都是通過 rpc 進行的。例 如: datanode  namenode  tasktracker jobtracker  secondary namenode  namenode 之間的通訊都是通過 rpc  現的。
RPC 模式
         RPC 採用客戶機 / 伺服器 模式 。請求程式就是一個客戶機, 而服務提供程式就是一個伺服器。首先,客戶機呼叫程式傳送 一個有程式引數的呼叫資訊到服務程式,然後等待應答資訊。 在伺服器端,程式保持睡眠狀態直到呼叫資訊的到達為止。當一個呼叫資訊到達,伺服器獲得程式引數,計算結果,傳送答 覆資訊,然後等待下一個呼叫資訊,最後, 客戶端 呼叫程式接 收答覆資訊,獲得程式結果,然後呼叫執行繼續進行。
工作原理
          執行時 , 一次客戶機對伺服器的 RPC 呼叫 , 其內部操作大致有如下十步:
1. 呼叫客戶端控制程式碼;執行傳送引數
2. 呼叫本地系統核心傳送網路 訊息
3. 訊息傳送到遠端 主機
4. 伺服器控制程式碼得到訊息並取得引數
5. 執行遠端過程
6. 執行的過程將結果返回伺服器控制程式碼
7. 伺服器控制程式碼返回結果,呼叫遠端系統核心
8. 訊息傳回 本地主機
9. 客戶控制程式碼由核心接收訊息
10. 客戶接收控制程式碼返回的資料
  
第二部分:Hadoop的RPC機制
Hadoop PRC
?Hadoop RPC在整個Hadoop中應用非常廣泛,Client、DataNode、NameNode之間的通訊全靠它了。
         舉個例子,我們平時操作HDFS的時候,使用的是FileSystem類,它的內部有個DFSClient物件,這個物件負責與NameNode打交道。在執行時,DFSClient在本地建立一個NameNode的代理,然後就操作這個代理,這個代理就會通過網路,遠端呼叫到NameNode的方法,也能返回值。
?Hadoop RPC 位於org.apache.hadoop.ipc
?Hadoop RPC = 動態代理 + 定製好的二進位制流
?分為Server與Clinet端
服務端流程
?Listener執行緒監視RPC Client傳送過來的資料。
?當有資料可以接收時,呼叫Connection的readAndProcess方法。
? Connection邊接收邊對資料進行處理,如果接收到一個完整的Call包,則構建一個Call物件。PUSH到Call佇列中,由Handler執行緒來處理Call佇列中的所有Call。
?Handler執行緒監聽Call佇列,如果Call佇列非空,按FIFO規則從Call佇列取出Call。
?將Call交給RPC.Server處理。
?藉助JDK提供的Method,完成對目標方法的呼叫,目標方法由具體的業務邏輯實現。
?返回響應。Server.Handler按照非同步非阻塞的方式向RPC Client傳送響應,如果有未傳送出的資料,則交由Server.Responder來完成。
 
服務端
結構
功能
 
Server.Listener
RPC Server的監聽者,用來接收RPC Client的連線請求和資料,其中資料封裝成Call後PUSH到Call佇列。
Server.Handler
RPC Server的Call處理者,和Server.Listener通過Call佇列互動。
Server.Responder
RPC Server的響應者。Server.Handler按照非同步非阻塞的方式向RPC Client傳送響應,如果有未傳送出的資料,交由Server.Responder來完成。
Server.Connection
RPC Server資料接收者。提供接收資料,解析資料包的功能。
Server.Call
持有客戶端的Call資訊。
 
客戶端
 
結構
功能
Client.ConnectionId
到RPC Server物件連線的標識
Client.Call
Call呼叫資訊。
Client.ParallelResults
Call響應。
RPC.Invoker
對InvocationHandler的實現,提供invoke方法,實現RPC Client對RPC Server物件的呼叫。
RPC.Invocation
用來序列化和反序列化RPC Client的呼叫資訊。(主要應用JAVA的反射機制和InputStream/OutputStream)
 
 
一些細節
1. 根據 RPC Server  IP  PORT 從連線池中拿 Con
2. 如果為空,新建連線放到連線池
3. 建立 Socket 建立到 Server 的連線
4. 建立輸入輸出流物件
5. 將序列化的引數發到服務端
6. 等待服務端響應
 
?客戶端發起的RPC呼叫是同步的,而服務端處理RPC呼叫是非同步的。客戶端呼叫執行緒以阻塞同步的方式發起RPC連線及RPC呼叫,將引數等資訊傳送給Listener,然後等待Connection接收響應返回。
?Listener負責接收RPC連線和RPC資料,當一個Call的資料接收完後,組裝成Call,並將Call放入由Handler提供的Call佇列中。
?Handler執行緒監聽Call佇列,如果Call佇列不為空,則按FIFO方式取出Call,並轉為實際呼叫,以非阻塞方式將響應發回給Connection,未傳送完畢的響應交給Responder處理。
 
第三部分:使用Hadoop RPC
流程
?實現VersionedProtocol
?繼承VersionedProtocol ,定義Server(即NameNode)
?實現Clinet(即DataNode)
  
實現VersionedProtocol 
public interface RPC Protocol Test extends VersionedProtocol {
    public Text println(Text t);
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29361362/viewspace-1062757/,如需轉載,請註明出處,否則將追究法律責任。

相關文章