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。

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

  • 1
  • 2
  • 下一页

相关内容

    暂无相关文章