Hadoop RestFul



Hadoop HDFS原理1



Hadoop HDFS原理2



Hadoop作业调优参数调整及原理



Hadoop HA



Hadoop MapReduce高级编程



Hadoop IO



Hadoop MapReduce工作原理



Hadoop 管理



Hadoop 集群安装



Hadoop RPC





第一部分:什么是RPC



        RPC (Remote Procedure Call Protocol) – 远程过程协议调用 。通过 RPC 我们可以从网络上的计算机请求服务,而不需要了 解底层网络协议。 Hadoop 底层的交互都是通过 rpc 进行的。例 如: datanode 和 namenode 、 tasktracker 和 jobtracker 、 secondary namenode 和 namenode 之间的通信都是通过 rpc



RPC 模式



        RPC 采用客户机 / 服务器 模式 。请求程序就是一个客户机, 而服务提供程序就是一个服务器。首先,客户机调用进程发送 一个有进程参数的调用信息到服务进程,然后等待应答信息。 在服务器端,进程保持睡眠状态直到调用信息的到达为止。当 一个调用信息到达,服务器获得进程参数,计算结果,发送答 复信息,然后等待下一个调用信息,最后, 客户端



工作原理



运行时 , 一次客户机对服务器的 RPC 调用 ,


2. 调用本地系统内核发送网络 消息



3. 消息传送到远程 主机




8. 消息传回 本地主机




第二部分: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



3. 创建 Socket 建立到 Server




客户端发起的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);
                   }