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 呼叫 , 其內部操作大致有如下十步:
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/,如需轉載,請註明出處,否則將追究法律責任。