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);
}
 
阅读更多
换一批

没有更多推荐了,返回首页