分享

hadoop rpc 实例

 Java私塾 2014-01-13


第一部分:什么是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. 客户接收句柄返回的数据

  

第二部分:HadoopRPC机制

Hadoop PRC

Hadoop RPC在整个Hadoop中应用非常广泛,ClientDataNodeNameNode之间的通讯全靠它了。

         举个例子,我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。

Hadoop RPC 位于org.apache.hadoop.ipc

Hadoop RPC = 动态代理 + 定制好的二进制流

分为ServerClinet

服务端流程

Listener线程监视RPC Client发送过来的数据。

当有数据可以接收时,调用ConnectionreadAndProcess方法。

 Connection边接收边对数据进行处理,如果接收到一个完整的Call包,则构建一个Call对象。PUSHCall队列中,由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的连接请求和数据,其中数据封装成CallPUSHCall队列。

Server.Handler

RPC ServerCall处理者,和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 ClientRPC 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);
}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多