歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Hadoop RPC機制&完整調用流程

Hadoop RPC機制&完整調用流程

日期:2017/3/1 10:00:53   编辑:Linux編程

RPC框架利用的Java的反射能力,該RPC框架要求調用的參數和返回結果必須是Java的基本類型,String和Writable接口的實現類,以及元素為以上類型的數組。同時,接口方法應該只拋出IOException異常。

選擇了java,為什麼不用現成的rmi?

答案就是:使用rpc可以對連接進行精細控制、超時、緩沖區處理等進行精確處理,rmi在這方面難以提供。

Dynamic Proxy其實就是一個典型的Proxy模式,它不會替你作實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。這個handler,在Hadoop的RPC中,就是Invoker對象。

動態代理例子:http://www.linuxidc.com/Linux/2013-02/80114.htm

Client和Server之間的控制信息是通過RPC機制完成的。DataNode端是通過獲得NameNode的代理,通過該代理和NameNode進行通信的。Client通過RPC機制、動態代理機制調用Server端的方法,Server端將方法調用結果返回給Client。

RPC.Invocation是一個方法調用類。包含以下變量:

  1. private String methodName;//方法名
  2. private Class[] parameterClasses;//參數類型
  3. private Object[] parameters;//參數值
  4. private Configuration conf;

繼承了Writeable,所以可以用於序列化傳輸。readFields和write方法分別借助ObjectWriteable類對上述三種變量的序列化和反序列化。

RPC.ClientCache是客戶端的緩存,用於維護客戶端集合,定義如下:

private Map<SocketFactory, Client> clients = new HashMap<SocketFactory, Client>();

在getClient中,如果SocketFactory對應的client不存在,就new一個,並將其加入clients中。

VersionMismatch是一個異常類,當Client的協議版本與Server的協議版本不匹配時會拋出此異常。

InvocationHandler 是代理實例的調用處理程序實現的接口。

Copyright © Linux教程網 All Rights Reserved