Hadoop RPC

一、说明

    Hadoop无论是1.x还是2.x机器不同角色之间的通信全部是通过RPC完成的,RPC底层都是通过Dynamic Proxy完成,无外乎就是TCP连接,验证协议,提取字段等等。所不同的是1.x采用的是plain java自己完成序列化与反序列化,而2.x底层采用的是PB序列化与反序列化,造成了使用的不同。


二、Dynamic Proxy基本概念

    Dynamic Proxy是动态代理,采用的是反射技术,在运行时动态生成对象,要求代理类与实际执行类具有相同的接口,同时实现InvocationHandler接口,最后通过Proxy类生成代理类:

Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

参数第一个为ClassLoader,第二个为共同的interface,第三个是实现的handler方法。这样调用代理的相应方法会调用handler方法。

 

三、RPC in Hadoop 1.x

    Hadoop底层RPC通信采用Dynamic Proxy,这样隔离了不同身份的机器之间底层连接检验等细节,而专注于业务逻辑。

    下面是Hadoop 1.x RPC的一个简单流程,比如DFSClient想要与NameNode通信,建立RPC连接。

(一)Client端

1、首先生成代理类,也就是本地的桩Rpc1

2、在RPC类中实现了底层的动态代理的一些包装,如上面DFSClient调用到RPC最后调用的是下面的方法

    可以看出最后底层调用的就是之前所得Dynamic Proxy,生成一个代理类。ClassLoader就是传递参数protocol的classloader,实现的接口就是interface,最后handler是报了一层的Invoker,下面看一下Invoker。Rpc2

3、Invoker实现了InvocationHandler接口,如下图

Rpc3

    其中首先生成一个ClientId,它的作用是作为Cache中的Key,RPC中有很多连接,通过ClientId获得Client。Client是真正发送数据流与输出流的部分。

4、Client中的call将参数以writable的形式通过Connection发送到Server端,等待Server端结果

Rpc4

    以上是Client端的部分,下面是Server端的部分,与之相对。


 

(二)Server端

 

1、比如NameNode启动的时候,会启动RPCServer,确定监听端口,完成初始化后启动RPC Server,之后无论是DataNode还是DFSClient与NameNode交互都通过RPC,Server接收后调用相应的接口,并返回结果。

 

Rpc5

2、Server的启动较简单,就是启动Listener与Responder,callingQueue等

Rpc6

3、当接收到Client的连接后通过NIO处理接收的连接,首先解析参数,封装成Call,放到处理队列中

Rpc7

4、Server中有大量的Handler线程,用来从callQueue中获取Call并进行处理,最后在RPC中通过反射执行,并将结果放到response中,最后返回给Client端

Rpc8
 
 

四、RPC in Hadoop 2.x

    Hadoop 1.x的RPC结构比较简单,实现类也只有6个,Hadoop 2.x的RPC相对来说复杂一些,实现了就30几个,最主要的改变是序列化与反序列化不采用1.x的Writable接口,而采用PB。

    同样以DFSClient为例子。

(一)Client端

1、首先生成本地桩,及代理类Rpc9

2、调用与1.x大致相同,也是通过Dynamic Proxy获得代理类,这个代理类也是个包装

Rpc10

3、在底层的实际的实现是NameNodeProxies类

Rpc11

4、在最底层其实与1.x相似

如果是ProtobufRpcEngine的话,最终生成proxy的方法是

Rpc12

5、Client与Server交互代码为

Rpc13

    可以看出只不过将序列化变为ProtocolBuffer的形式,其它没有什么变化。


(二)Server端

1、NameNode启动时候与1.x一样,启动RPC,2.x与1.x的区别是启动更加细化,更加清晰Rpc14

2、其它部分其实与1.x差不多,生成Server部分,其中Server继承自1.x的Server类,也同样包括了handler,queue,responder等等,所不同的是加入了PB

Rpc15Rpc16

 

    综上1.x与2.x最大的区别就在于PB进行序列化与反序列化,底层的Dynamic Proxy以及TPC连接等等,变化不大。

Print Friendly

jiang yu

Leave a Reply