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端

集群错误记录

     今早被人发邮件说集群任务有个reduce一直无法完成,查看了一下日志,发现有大量的创建块操作失败,根据以往的经验,当年曾经被桌面级磁盘坑过,这种情况无外乎是压力过大,导致pipeline长时间无法建立。然后通过ganglia检查后发现并没有太大的压力。

     检查DataNode日志发现有大量的too many open files错误,很低级的错误,装机后没有改好配置。
     ulimit -a 后印证了想法,nofile为1024。
     同时记录一下:
     18内核修改/etc/security/limits.conf文件,32内核除了修改上面的文件,还需要修改/etc/security/limits.d/90-nproc.conf文件。
     *     soft     nofile     65535
     *     hard    nofile     65535