Hadoop中的RPC機制分析

Hadoop中的RPC

      Hadoop中的RPC是Hadoop系統內部的通信機制,由於RPC採用客戶機/服務器的模式,所以通信時一方爲客戶機,另一方爲服務器。它的協議是一個Java接口,協議規定所有參數和返回類型都必須是:

    1)boolean, byte, char, short, int, long, float, double, void;

    2) String;

    3) Writable;

    4) 上面幾種類型的數組;

    假設這樣的一種通信:客戶機C向服務器S發出通信請求,其中可能存在多個請求。通信流程如下:

    首先,RPC客戶機發出一個RPC調用,JAVA反射機制將該調用轉化爲對client.call的調用。

   然後,建立到S的連接,通過getConnection方法獲取連接,如果ConnctionId已存在,直接將此連接返回;否則根據ConnectionId新建一個連接。其中,ConnctionId是Client的內部類,包含S的地址和用戶信息,通過<地址,協議,用戶>來唯一標識一個C到S的連接。連接之後,就由Connection將Call的相關參數信息序列化,併發送給S。接着就等待服務器的響應直到Call結束。如果中間出錯,就會中斷線程。

   接着,就是S執行相應的操作。C和S之間通信是通過Socket完成的。S使用Listener線程循環等待RPC客戶端的發送數據過來,當有數據可讀的時候,doRead方法調用Connection的readAndProcess方法。Connection邊接收邊對數據進行處理(processData方法讀取數據,並構建Call),如果接收到一個完整的Call包,則構建一個Call對象,並將這個Call對象PUSH到Call隊列中,由Handler線程來處理Call隊列中的所有Call。

   然後,Handler線程處理Call隊列(Handler是Server的內部類,繼承java.lang.Thread)。Call隊列是用java.util.concurrent.BlockingQueue存儲,處理Call作業時採用簡單的FIFO(先進先出)的方法,作業爲空時,進程進入wait狀態。最後返回響應時,由於響應需要通過SOCKET返回給C,所以響應的類型必須是Writable

RPC各線程之間調用關係(來自http://bbs.hadoopor.com/thread-329-1-2.html):

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章