Hadoop RestFulnode
Hadoop HDFS原理1apache
Hadoop HDFS原理2编程
Hadoop做业调优参数调整及原理服务器
Hadoop HA网络
Hadoop MapReduce高级编程异步
Hadoop IOoop
Hadoop MapReduce工做原理spa
Hadoop 管理线程
Hadoop 集群安装代理
Hadoop RPC
第一部分:什么是RPC
RPC (Remote Procedure Call Protocol) – 远程过程协议调用 。经过 RPC咱们能够从网络上的计算机请求服务,而不须要了 解底层网络协议。 Hadoop 底层的交互都是经过 rpc 进行的。例 如: datanode 和 namenode 、 tasktracker 和 jobtracker 、 secondary namenode 和 namenode 之间的通讯都是经过 rpc 实现的。
RPC 模式
RPC 采用客户机 / 服务器 模式 。请求程序就是一个客户机, 而服务提供程序就是一个服务器。首先,客户机调用进程发送 一个有进程参数的调用信息到服务进程,而后等待应答信息。 在服务器端,进程保持睡眠状态直到调用信息的到达为止。当 一个调用信息到达,服务器得到进程参数,计算结果,发送答 复信息,而后等待下一个调用信息,最后, 客户端 调用进程接 收答复信息,得到进程结果,而后调用执行继续进行。
工做原理
运行时 , 一次客户机对服务器的 RPC 调用 , 其内部操做大体有以下十步:
1. 调用客户端句柄;执行传送参数
2. 调用本地系统内核发送网络 消息
3. 消息传送到远程 主机
4. 服务器句柄获得消息并取得参数
5. 执行远程过程
6. 执行的过程将结果返回服务器句柄
7. 服务器句柄返回结果,调用远程系统内核
8. 消息传回 本地主机
9. 客户句柄由内核接收消息
10. 客户接收句柄返回的数据
第二部分:Hadoop的RPC机制
Hadoop PRC
•Hadoop RPC在整个Hadoop中应用很是普遍,Client、DataNode、NameNode之间的通信全靠它了。
举个例子,咱们平时操做HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地建立一个NameNode的代理,而后就操做这个代理,这个代理就会经过网络,远程调用到NameNode的方法,也能返回值。
•Hadoop RPC 位于org.apache.hadoop.ipc
•Hadoop RPC = 动态代理 + 定制好的二进制流
•分为Server与Clinet端
服务端流程
•Listener线程监视RPC Client发送过来的数据。
•当有数据能够接收时,调用Connection的readAndProcess方法。
• Connection边接收边对数据进行处理,若是接收到一个完整的Call包,则构建一个Call对象。PUSH到Call队列中,由Handler线程来处理Call队列中的全部Call。
•Handler线程监听Call队列,若是Call队列非空,按FIFO规则从Call队列取出Call。
•将Call交给RPC.Server处理。
•借助JDK提供的Method,完成对目标方法的调用,目标方法由具体的业务逻辑实现。
•返回响应。Server.Handler按照异步非阻塞的方式向RPC Client发送响应,若是有未发送出的数据,则交由Server.Responder来完成。
服务端
结构
功能
Server.Listener RPC Server的监听者,用来接收RPC Client的链接请求和数据,其中数据封装成Call后PUSH到Call队列。
Server.Handler RPC Server的Call处理者,和Server.Listener经过Call队列交互。
Server.Responder RPC Server的响应者。Server.Handler按照异步非阻塞的方式向RPC Client发送响应,若是有未发送出的数据,交由Server.Responder来完成。
Server.Connection RPC Server数据接收者。提供接收数据,解析数据包的功能。
Server.Call 持有客户端的Call信息。
客户端
结构 功能
Client.ConnectionId 到RPC Server对象链接的标识
Client.Call Call调用信息。
Client.ParallelResults Call响应。
RPC.Invoker 对InvocationHandler的实现,提供invoke方法,实现RPC Client对RPC Server对象的调用。
RPC.Invocation 用来序列化和反序列化RPC Client的调用信息。(主要应用JAVA的反射机制和InputStream/OutputStream)
一些细节
1. 根据 RPC Server 的 IP 与 PORT 从链接池中拿 Con
2. 若是为空,新建链接放到链接池
3. 建立 Socket 创建到 Server 的链接
4. 建立输入输出流对象
5. 将序列化的参数发到服务端
6. 等待服务端响应
•客户端发起的RPC调用是同步的,而服务端处理RPC调用是异步的。客户端调用线程以阻塞同步的方式发起RPC链接及RPC调用,将参数等信息发送给Listener,而后等待Connection接收响应返回。
•Listener负责接收RPC链接和RPC数据,当一个Call的数据接收完后,组装成Call,并将Call放入由Handler提供的Call队列中。
•Handler线程监听Call队列,若是Call队列不为空,则按FIFO方式取出Call,并转为实际调用,以非阻塞方式将响应发回给Connection,未发送完毕的响应交给Responder处理。
第三部分:使用Hadoop RPC
流程
•实现VersionedProtocol
•继承VersionedProtocol ,定义Server(即NameNode)
•实现Clinet(即DataNode)
实现VersionedProtocol
public interface RPC Protocol Test extends VersionedProtocol {
public Text println(Text t);
}