您的位置:首页 > 大数据 > Hadoop

Hadoop实战-中高级部分 之 Hadoop RPC

2013-12-04 13:42 330 查看
Hadoop RestFulHadoop HDFS原理1Hadoop HDFS原理2Hadoop作业调优参数调整及原理Hadoop HAHadoop MapReduce高级编程Hadoop IOHadoop 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调用,其内部操作大致有如下十步:1.调用客户端句柄;执行传送参数2.调用本地系统内核发送网络消息3.消息传送到远程主机4.服务器句柄得到消息并取得参数5.执行远程过程6.执行的过程将结果返回服务器句柄7.服务器句柄返回结果,调用远程系统内核8.消息传回本地主机9.客户句柄由内核接收消息10.客户接收句柄返回的数据第二部分:Hadoop的RPC机制Hadoop PRCHadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。 举个例子,我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。Hadoop RPC 位于org.apache.hadoop.ipcHadoop 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.ListenerRPC Server的监听者,用来接收RPC Client的连接请求和数据,其中数据封装成Call后PUSH到Call队列。
Server.HandlerRPC Server的Call处理者,和Server.Listener通过Call队列交互。
Server.ResponderRPC Server的响应者。Server.Handler按照异步非阻塞的方式向RPC Client发送响应,如果有未发送出的数据,交由Server.Responder来完成。
Server.ConnectionRPC Server数据接收者。提供接收数据,解析数据包的功能。
Server.Call持有客户端的Call信息。
客户端
结构功能
Client.ConnectionId到RPC Server对象连接的标识
Client.CallCall调用信息。
Client.ParallelResultsCall响应。
RPC.Invoker对InvocationHandler的实现,提供invoke方法,实现RPC Client对RPC Server对象的调用。
RPC.Invocation用来序列化和反序列化RPC Client的调用信息。(主要应用JAVA的反射机制和InputStream/OutputStream)
一些细节1.根据RPC Server的IP与PORT从连接池中拿Con2.如果为空,新建连接放到连接池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 RPCProtocolTestextends VersionedProtocol {
public Text println(Text t);
}
转载请注明出处【 http://sishuok.com/forum/blogPost/list/0/5968.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息