您的位置:首页 > 运维架构 > 网站架构

[读书笔记]深入解析MapReduce架构设计与实现原理——CH4 Hadoop RPC基本框架

2014-09-15 20:36 1056 查看
Hadoop的RPC框架主要包括3个组成部分,也对应三个类,RPC(ipc.RPC类)、Client(ipc.Client类)、Server(ipc.Server类)。

Hadoop的RPC使用有几个步骤:

1、定义RPC协议,实际是定义一个接口需要继承VersionedProtocol接口,里面声明方法。

2、实现RPC协议,实现上面定义的那个接口。

3、构造启动RPC Server,使用RPC.getServer()构造RPC Server,使用start()方法启动。

4、构造RPC Client,使用getProxy()方法构造客户端代理对象,直接通过客户端代理对象调用远程端的方法,这里就用到了J***A中的动态代理。这里我猜想可能调用了代理对象的某个方法后,会触发InvocationHandler的invoke()方法,然后调用远程端某个类中的方法。

一、ipc.Server类

ipc.Server是Hadoop中Master和Slave之间的沟通桥梁,Master通过ipc.Server接收并处理所有的Slave发送的请求,因此ipc.Server最主要的要求就是高并发性和可扩展性,主要采用线程池、事件驱动和Reactor设计模式。Reactor设计模式本身调用了操作系统的多路分离函数,同时等待多个句柄,在等待过程中所在线程被挂起,一旦句柄被触发,则线程被唤醒,函数返回,线程继续执行。实际是用单线程代替了多线程,节省了系统的资源。Reactor主要通过派发/分离I/O操作事件,模仿异步操作,提高系统的并发性能。

Reactor模式中通过Acceptor接受来自多个Client的连接,同时为每个Client建立Handler(句柄),然后向Reactor注册这些Handler,由Reactor进行I/O事件的分发,分发给不同的Reader和Sender线程。而为了加速处理,则为Reader线程和Sender线程建立线程池,一旦数据从Reader线程中读出,则放到线程池中等待后续处理,针对Reader线程和Sender线程,Handler也一般分离为读事件和写事件,读为Reader线程处理,写为Sender线程处理。

Server类有三个阶段:接受请求、处理请求和返回结果。



二、ipc.Client类

Client类主要是发送远程过程调用信息并接收执行结果。主要通过Call类和Connection类进行调用。

Call类负责封装请求。Client通过Call中封装的id来识别不同函数调用;Connection类是Client与每个Server之间维护一个通信连接,是一个线程类,run方法调用receiveResponse方法,等待接收RPC返回结果。

三、ipc.RPC类

RPC类主要就是对底层的C/S模型进行了封装,里面使用java的反射机制实现了call接口,可以根据客户端发来请求中的方法名和参数找到对应的方法完成调用。RPC使用ClientCache对Client对象进行缓存,这样可以减缓调用Client对象时Server端的压力,也可以方便重用Client对象。

RPC类中主要包含的方法:call接口,getClient,getProxy,stopProxy,waitForProxy。

RPC类中会使用动态代理和反射机制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐