再看hadoop PRC

以前写过一篇文章叫做《hadoop RPC从入门到暂时放弃》,现在粗略的把《Hadoop 2.xHDFS源码剖析》看完了第一遍,感觉对HDFS的整体了解上升了一个层次,并且重新看了一下动态代理、protocol buffer所以这次重新来写写对于hadoop RPC的认识。

下面还是主要通过ClientProtocol协议,即hdfs客户端与NameNode通信的协议,来介绍一下对hadoopRPC的认识。

  1. 客户端

首先编写程序操作hadoop hdfs的时候,通常都是会用到DFSClient这个类的,这里的DFSClient类中,持有一个实现了ClientProtocol接口的ClientNameNodeProtocolTranslatorPB(以下简称translator)的对象实例,这个实例主要的功能就是将ClientProtocol转化为protocol buffer方式序列化的请求,其实主要也是在这其中使用动态代理获取了ClientNamenodeProtocolPB的代理对象来实现转换。其中获取translator的时候还需要考虑NameNode是否是HA模式的。

其次Client部分最主要的方法就是Client.call方法,在调用call方法时会需要获取相应RPCServer 的连接对象(Connection),但是由于建立连接在任何一个系统中都是一个十分耗时的操作,所以connection会缓存到相应服务器的连接。Connection对象除了负责建立连接之外,还会在获取相应请求对应的应答后唤起相应请求的线程。PRC请求除了包括经过protocol buffer序列化的参数,还有对应的请求协议的标识字段。当接收到请求相应的应答时,会根据callId唤起等待的线程,这里根据RPC调用是否成功需要考虑是调用正常的接受应答方法还是异常的应答方法。

 

 2.服务器

NameNodeRPC服务器为例,它有一个名为NameNodeRpcServer的类专门负责从客户端、DataNode、以及其他NameNode发送过来的PRC请求。由于需要处理多种PRC协议(例如从客户端发来的ClientNameNodeProtocolPB),所以在这个类中需要一个叫做BlockingService的类,根据发送的请求中关于调用协议的信息,找出相应得serverSideTranslator来处理相应的*PB协议转化为真正的协议,例如通过clientNNPbService这个BlockingService将从客户端发来的ClientNamenodeProtocolPB协议,利用clientProtocolServerTranslator转化为jvm能够识别的ClientProtocol协议。

除此之外,RPC服务端还参考了reactor设计模型,采用线程池以及nio的思想,提高了并发能力,具体细节可以参考以前写得《hadoop RPC从入门到暂时放弃》。

 

         以上差不多就是对hadoopRPC的全部认识了,以后有新的了解在及时更新。

                                                                                                                         肯草在深圳

                                                                                                                         2017-03-12