Hadoop學習筆記(一)——RPC
Hadoop RPC學習筆記
首先RpcEngine。這個介面中了Server端的getServer和Call方法。Client端的getProxy和stopProxy的方法。
從Server端看起
RPC.Server getServer(Class<?> protocol, Object instance, String bindAddress,
int port, int numHandlers, int numReaders,
int queueSizePerHandler, boolean verbose,
Configuration conf,
SecretManager<? extends TokenIdentifier> secretManager
) throws IOException;
這個介面這個引數的函式可以從一個呼叫的例子來看
this.serviceRpcServer = RPC.getServer(NamenodeProtocols.class, this,
dnSocketAddr.getHostName(), dnSocketAddr.getPort(), serviceHandlerCount,
false, conf, namesystem.getDelegationTokenSecretManager());
this.serviceRPCAddress = this.serviceRpcServer.getListenerAddress();
nn.setRpcServiceServerAddress(conf, serviceRPCAddress);
這是Namenode初始化時的建立RPC Server例項的呼叫。實際呼叫的實現,是每個Protocol對應的RpcEngine的例項的實現。RpcEngine的例項怎麼來的呢?是根據配置的類名(如rpc.engine.NamenodeProtocols)反射得到的。預設RpcEngine是WritableRpcEngine(hadoop還提供了一種AvroRpcEngine,跳過沒看)。WritableRpcEngine的getServer沒有特別,一直追溯到頂層的Server,即ipc包中的抽象Server類。到這個類中,就可以窺視到所有Server的重要元素(靜態內部類),如Call,Listener,Responder,Connection,Handler。不表先,回到Server的建構函式中來。
前面無非是設定一些Server屬性,地址埠,各種佇列長度,read執行緒數等等(paramClass這個單獨說)。重點是這裡。
listener = new Listener();
this.port = listener.getAddress().getPort();
this.rpcMetrics = RpcMetrics.create(this);
this.rpcDetailedMetrics = RpcDetailedMetrics.create(this.port);
this.tcpNoDelay = conf.getBoolean("ipc.server.tcpnodelay", false);
然後是一個Responder的例項。
responder = new Responder();
一個Server例項就這樣初始化完成了。在各種Server端的Init中就會呼叫他start以啟動服務。start分別start responder,listener,handler。分別看。
Listener的Run迴圈select,對於每個select到的key,DoAccept。DoAccept主要邏輯程式碼如下:
Reader reader = getReader();//輪流喚醒reader執行緒
reader.startAdd();
SelectionKey readKey = reader.registerChannel(channel);//將reader的selector註冊到channel中
c = new Connection(readKey, channel, System.currentTimeMillis());
readKey.attach(c);
synchronized (connectionList) {
connectionList.add(numConnections, c);
numConnections++;
}
reader執行緒喚醒後,根據attach再seletkey上得connection提供的readAndProcess方法,讀取到資料後,根據server註冊的paramClass類,生成方法和引數物件,根據這些物件例項化一個Call例項,放入Call佇列中。
Call類不復雜,就是維護一個呼叫的屬性。引數,連線物件,結果資料和處理時長相關的資訊。
private int id; // the client's call id
private Writable param; // the parameter passed
private Connection connection; // connection to client
private long timestamp; // the time received when response is null
// the time served when response is not null
private ByteBuffer response; // the response for this call
Responder在Server例項化時例項化,在Server Start時啟動,是一個daemon執行緒。暴露的外部方法。
void doRespond(Call call) throws IOException {
synchronized (call.connection.responseQueue) {
call.connection.responseQueue.addLast(call);
if (call.connection.responseQueue.size() == 1) {
processResponse(call.connection.responseQueue, true);
}
}
}
大致就是這樣。Server的幾個重要組成部分就是Listener,Handler,Responder,Connection和Call。主要涉及到的知識點有兩部分:Java NIO和反射。
相關文章
- hadoop 學習筆記Hadoop筆記
- MIT 6.824 學習筆記(一)--- RPC 詳解MIT筆記RPC
- Hadoop學習筆記之一 : HDFS原理一Hadoop筆記
- hadoop學習筆記——第一個程式Hadoop筆記
- Hadoop學習筆記—YarnHadoop筆記Yarn
- Hadoop學習筆記—HDFSHadoop筆記
- Hadoop學習筆記——————1、Hadoop概述Hadoop筆記
- Hadoop學習筆記之一 : HDFS原理二Hadoop筆記
- hadoop學習筆記(十)——hadoop + hbase + zookeeperHadoop筆記
- Hadoop學習筆記—17.Hive框架學習Hadoop筆記Hive框架
- Hadoop2.x學習筆記Hadoop筆記
- hadoop1.X學習筆記Hadoop筆記
- Hadoop學習筆記 - Sort / TeraSort / TestDFSIOHadoop筆記
- 大資料之 Hadoop學習筆記大資料Hadoop筆記
- hadoop 偽分散式模式學習筆記Hadoop分散式模式筆記
- Web Service學習筆記之----JAX-RPC (轉)Web筆記RPC
- 學習筆記(一)筆記
- Hadoop學習筆記--發展歷程&版本Hadoop筆記
- kitten 學習教程(一) 學習筆記筆記
- LaTeX學習筆記:一筆記
- ANFIS學習筆記(一)筆記
- Angular 學習筆記(一)Angular筆記
- GOLang 學習筆記(一)Golang筆記
- oracle學習筆記《一》Oracle筆記
- React 學習筆記【一】React筆記
- Jquery學習筆記(一)jQuery筆記
- goLang學習筆記(一)Golang筆記
- Canvas學習筆記(一)Canvas筆記
- SCSS學習筆記(一)CSS筆記
- vue學習筆記一Vue筆記
- Kettle學習筆記(一)筆記
- kafka學習筆記(一)Kafka筆記
- Cesium學習筆記(一)筆記
- opencv學習筆記(一)OpenCV筆記
- 深度學習 筆記一深度學習筆記
- javaNIO學習筆記一Java筆記
- Maven 學習筆記一Maven筆記
- css學習筆記(一)CSS筆記