Hadoop RPC 源码详解
一、什么是RPC
RPC,即Remote Procdure Call,中文名:远程过程调用,
rpc远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
通俗的说就是:两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。
如图:
二、基础技术
1、java动态代理和反射:通过实现InvocationHandler接口实现。
2、Java NIO:底层通过多路复用实现的IO。
3、网络编程:Reactor(反应器)设计模式,一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式
三、hadoop Rpc三要素
1、交互协议 :org.apache.hadoop.ipc.VersionedProtocol
不同版本与签名的协议,就算同一个类名也无法通信
2、客户端: Client,封装请求数据,并接收Response
3、服务端: RPC.Server 处理客户端的连接请求,并处理相关业务,最后返回结果
四、 rpc客户端
1、RPC.getProxy:
客户端拿到协议对象,RPC.getProxy就是得到协议对象的方法,它默认先得到一个RpcEngine(默认实现是WritableRpcEngine)
2、WritableRpcEngine:
生成代理对象
其实就实例化2个成员变量:
ConnectionID:
保存目标地址(remoteAddress,protocol)和用户ticket,这三者可以唯一确定一个Connection。
Client:
主要完成的功能是发送远程调用信息并接收返回结果。
3、invoke
当我们调用客户端本地方法的时候,执行代理对象里面的invoke。client.call
就是网络通讯了。
rpc请求客户端(org.apache.hadoop.ipc.Client.Connection)的几个配置:
ipc.client.connection.maxidletime=10000 毫秒,最大时间,超过后客户端会断开和服务器的连接
ipc.client.connect.max.retries.on.timeouts=45 在连接超时后,客户端连接重试次数:
ipc.client.tcpnodelay=true 客户端参数。或许可以考虑关闭Nagle算法,增加客户端响应速度
ipc.client.ping=true 当为true时,如果读取响应超时,则向服务器发送ping命令。
ipc.ping.interval=60000 等待服务器响应的超时时间,单位为毫秒。当ipc.client.ping属性为true时,客户端将在不接收字节的情况下发送Ping命令。
五、 rpc服务端
Server端涉及到多个客户端的调用,所以使用了如下的设计,统称为Reactor设计模式。Reactor主要是基于多路复用的非阻塞IO实现的基于事件驱动的IO框架。Hadoop RPC底层使用的是Java NIO,而Java NIO正好就是一种多路复用的非阻塞IO,Java NIO的重点就是在Selector。
架构设计图
1)Listener
监听类,用以监听客户端发来的请求。同时Listener下面还有一个静态类,Listener.Reader,当监听器监听到用户请求,便用让Reader读取用户请求。
Listener主要负责Socket的监听以及Connection的建立,同时监控ClientSocket的数据可读事件,通知Connection进行processData,收到完成请求包以后,封装为一个Call对象(包含Connection对象,从网络流中读取的参数信息,调用方法信息),将其放入队列
2)Call
用以存储客户端发来的请求,这个请求会放入一个BlockQueue中;
每个call存放到callQueue队列
模型对象
3)Handler
请求(blockQueueCall)处理类,会循环阻塞读取callQueue中的call对象,并对其进行操作。
4)Responder
响应RPC请求类,请求处理完毕,由Responder发送给请求客户端。
它不断地检查响应队列中是否有调用信息,如果有的话,就把调用的结果返回给客户端
rpc请服务端可优化的配置
ipc.server.listen.queue.size=128 接受客户端连接的服务器的侦听队列的长度。
ipc.maximum.data.length=67108864 服务器可以接受的最大IPC消息长度(字节)64M
ipc.server.max.response.size=1024*1024 响应ipc请求消息的最大长度;再大的消息量,消息会被记录到log里
ipc.server.handler.queue.size=100 handler最大线程数据
ipc.server.read.threadpool.size=1 reader最新线程数据
入口类 org.apache.hadoop.ipc.Server
疑问:Listener在创建Reader线程的时候为什么不用线程池而是根据配置的线程数直接创建线程???
六、 总结
核心主要流程
我的标签
随笔档案
- 2020-04 (3)
- 2019-09 (2)
- 2019-08 (1)
- 2019-01 (1)
- 2017-09 (1)
- 2017-06 (1)
- 2017-05 (3)
- 2017-03 (1)
- 2017-02 (2)
- 2017-01 (3)
- 2016-12 (2)
- 2016-10 (3)
- 2016-09 (2)
- 2016-08 (3)
- 2016-07 (2)
- 2016-06 (2)
- 2016-05 (3)
- 2016-04 (2)
- 2016-03 (2)
- 2016-01 (3)
- 2015-12 (3)
- 2015-11 (2)
- 2015-10 (3)
- 2015-09 (1)
- 2015-08 (1)
- 2015-07 (4)
- 2015-05 (3)
- 2015-04 (4)
- 2015-02 (2)
- 2015-01 (4)
- 2014-12 (4)
- 2014-11 (2)
- 2014-10 (19)