通俗來講rpc
(remote procedure call
)就是呼叫遠端的過程或者方法,既然涉及到遠端,必然會有
c/s架構,即
client
和server
。下面首先來看一下
client
端的實現。
為實現遠端方法呼叫,最重要的就是跟遠端伺服器進行連線,然後不斷的傳輸客戶端想要呼叫的方法,包括方法的引數等。為此client
有兩個最重要的變數與之一一對應,
connection
和call
。其中,
connection
代表與遠端伺服器之間的連線;
call
是乙個方法呼叫的抽象。
connection
有乙個佇列,儲存所有需要到該
connection
對應的伺服器進行呼叫的方法。因為乙個
client
可能同時需要到多個伺服器進行方法呼叫,如
hdfs
一次檔案操作,不但需要跟
namenode
進行通訊,還需要與
datanode
進行通訊;因此,
client
會包含乙個
connection
的佇列。為了區分不同的
connection
,client
定義了另外乙個
class connectionid
來標識不同的連線。
下面我看一下call
的實現,
call
具體是比較簡單的,如下**:
private
class call {
intid; // call id
writable param; // parameter
writable value; // value, null if error
ioexception error; // exception, null if value
boolean
done; // true when call is done
protected call(writable param) {
this.param = param;
synchronized (client.this) {
this.id = counter++;
下面jurisdiction
解析一下其不同成員變數的意義,
id是在同乙個
connection
上不同方法呼叫的標識;
param
是client
傳向伺服器端的資料,一會具體分析;
value
是返回結果。其中我們具體分析一下
param
,在call
中param
的具體實現是
class invocation
,invocation
具體代表了乙個方法,其實現如下:
private
static
class invocation implements writable, configurable {
private string methodname;
private class parameterclasses;
private object parameters;
private configuration conf;
其中,methodname
代表遠端呼叫的方法的名字;
parameterclasses
代表傳入方法引數的型別;
parameters
代表傳入方法引數的值。
如此結合另外一篇檔案《hadoop rpc
整個使用流程——以
datanode
向namenode
註冊為例》則整個
rpc的過程就比較容易理解了。
HDFS原始碼分析DataXceiver之讀資料塊
process op by the corresponding method.protected final void processop op op throws ioexception 那麼今天,我們首先來看下第一種資料讀寫請求 讀資料塊read block,它是通過呼叫opreadblock ...
HDFS的DataNode原始碼分析
1.大致流程 datanode.main 入口函式 securemain args,null createdatanode args,null,resources 建立datanode instantiatedatanode args,conf,resources getstoragelocatio...
client讀寫hdfs的原始碼分析總結
週末花了一天的時間仔細了重溫了一下client對hdfs檔案的讀寫過程,總結如下 每次讀寫都是以乙個資料塊的形式來進行的,並且包括資料內容和資料的校驗值。另外,到 namenode 上獲取相應的資訊都是用 rpc來通訊的,而到 datanode 獲取真正的資料塊內容是由 socket 的網路流來進行...