Hadoop RPC机制完整调用流程

RPC框架利用的Java的反射能力,该RPC框架要求调用的参数和返回结果必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。同时,接口方法应该只抛出IOException异常。

选择了java,为什么不用现成的rmi?

答案就是:使用rpc可以对连接进行精细控制、超时、缓冲区处理等进行精确处理,rmi在这方面难以提供。

Dynamic Proxy其实就是一个典型的Proxy模式,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。这个handler,在Hadoop的RPC中,就是Invoker对象。

动态代理例子:

Client和Server之间的控制信息是通过RPC机制完成的。DataNode端是通过获得NameNode的代理,通过该代理和NameNode进行通信的。Client通过RPC机制、动态代理机制调用Server端的方法,Server端将方法调用结果返回给Client。

Hadoop RPC机制完整调用流程

RPC.Invocation是一个方法调用类。包含以下变量:

private String methodName;//方法名  

private Class[] parameterClasses;//参数类型  

private Object[] parameters;//参数值  

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 是代理实例的调用处理程序实现的接口。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1ac3e0d6913672f916df3880e71d911a.html