Hadoop中的RPC实现(概述)

Hadoop作为一个存储与服务的基础性平台,同时它的内部有采用了master/slave架构,那么其内部通信和与客户端的交互就是必不可少的了。Hadoop在实现时抛弃了JDK自带的一个RPC实现——RMI,而自己基于IPC模型实现了一个高效的轻量级RPC。

相关阅读:Hadoop中的RPC实现——客户端通信组件

整体结构

在IPC包中,最重要的3个类是ServerC,lient和RPC,它们具有层次化的结构。

1.   1.RPC类是对Server、Client的具体化。在RPC类中规定,客户程序发出请求调用时,参数类型必须是Invocation;从服务器返回的值类型必须是ObjectWritable。为了加强理解,可以查看测试类TestIPC。在那里,规定的参数类型与返回值类型都是LongWritable。

2.   2.RPC类是对Server、Client的包装,简化用户的使用。如果一个类需充当服务器,只需通过RPC类的静态方法getServer获得Server实例,然后start。同时此类提供协议接口的实现。如果一个类充当客户端,可以通过getProxy或者waitForProxy获得一个实现了协议接口的proxy object,与服务器端交互。为了加强理解,可以查看测试类TestRPC,在那里,实现的协议接口为TestProtocol。

•Server类

1.    1.启动Listener进程。如果收到需要建立连接的请求,将建立连接,然后在上面捕获读操作的命令。收到命令之后,将把解析客户端发过来信息的工作委派给Connection。Connection把信息封装到Call对象中,放入队列中,待Handler处理。

2.    2.启动指定数目的Handler线程,处理客户端对指定方法调用的请求,然后把结果返回给客户端。

•Client类

1.    1.用Call封装好调用信息,然后借助从连接池中取出的Connection向服务器端发送,等待结果。如果到指定服务器的Connection不存在,将马上建立。Connection线程读取服务器方法调用的返回信息。完成之后,通知主线程。

客户端C要发起向服务端S的关于方法M调用

1. C首先创建一个通向S的连接getConnection,然后将此次调用放入CallList里,这样客户端就可以同时发生很多调用,每个调用用ID来识别。

2. 发送调用参数。调用参数是Client的调用方(比如NameNode,DataNode等)指定的,一般就是一个Invocation对象,里面包含要调用的方法和参数。了解JAVA动态代理类java.lang.reflect.Proxy会对这里的理解有很大帮助。

3. 等待调用结果.Client.Connection是个线程类,启动了之后唯一做的时候就是等待调用结果

对于服务器端,其有一个方法start指定了启动服务器开始监听,这个start被四个类调用,分别是TaskTracker.initialize,Namenode.initialize,Jobtracker.offerService,Datanode.startDatanode显然,任何两者之间的通信都是考这个client-server模型实现的。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/162ee8d0925495780c8da8ba3608aed5.html