分享

HadoopIPC包源码分析

cochou 发表于 2015-1-29 20:54:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 7281
Hadoop的IPC:

(1)实现RPC的一种方法,具有快速、简单的特点。 它不像Sun公司提供的标准RPC包,基于Java序列化。

(2)IPC无需创建网络stubs和skeletons。

(3)IPC中的方法调用要求参数和返回值的数据类型必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。接口方法应该只抛出IOException异常。



构建思路:
(1)采用客户/服务器模型

(2)Server:它把Java接口暴露给客户端。指定好监听端口和接受远程调用的对象实例后,通过RPC.getServer()可以得到Server实例。

(3)Client:连接Server,调用它所暴露的方法。Client必须指定远程机器的地址,端口和Java接口类,通过RPC.getClient()可以得到Client实例。

(4)Server不可以向Client发出调用,但在Hadoop中,有双向调用的需求。 比如在DFS,NameNode和DataNode需要互相了解状态。

详细设计:

(1)Writable接口,实现此接口的类可以把类中的域放入流中以及从流中读数据到域中。

(2)对象在传递时按照:对象类名+对象类名长度+对象序列化数据,的格式传输,需要一个类可以解析这种格式,这个类是ObjectWritable,这个类需要知道所有实现Writable的类,以便可以通过类名生成新的对象,故此类依赖于WritableFactories,那存储了Writable子类对应的工厂。

(3)Client类用来和Server通信,一个Client可以发起多个连接,连接需要标识,使用Client.ConnectionId(包含InetSocketAddress,UserGroupInformation,Class<?>)。每个连接有多个调用,使用Client.Call标识(包含int<id>,Writable<param,value>,IOException,boolean<done>)。每个连接用Hashtable<Integer, Call>保存发起的调用。

(4)RPC是Server和Client的结合,waitForProxy方法用来返回一个所有可以采用这种IPC调用的所有接口的父接口VersionedProtocol,其他不同的接口继承这个父接口,这些接口需要有一个版本号。waitForProxy方法的参数应该有用户想要调用方法的接口类<Class>,远程调用的地址<InetAddress>等等。waitForProxy方法返回的是一个动态代理,真正完成方法远程调用的是RPC.Invoker因为,它实现了InvocationHandler接口。

(5)Invoker主要从缓存中取一个Client出来,然后调用Client.call方法,这个方法需要知道方法名,方法参数,方法声明类以及远端地址。

(6)Client.call方法需要根据ConnectionId从缓存中获得Connection,或者新建立一个Connection。Connection的sendParam方法供调用call的线程发送调用参数(方法名,方法参数,方法声明类),在调用sendParam之前,Connection已经建立好连接并发送ConnectionHeader,之后立刻启动接受线程,接受到的可能是函数调用的结果,也可能是连接上的异常消息。

(7)Server的Listen线程负责监听新连接并把读取的调用参数放入BlockingQueue队列,Handler线程负责从队列中拿出Call对象进行处理。



(8)Hadoop的IPC框架做得很好,接下来准备仿照实现一个,更好的发现这个框架的实现技巧。

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条