标签:lis key 基于 handle puts 导致 ken 备份 参考资料
hadoop的RPC基本概念:
1,RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式程序在内的应用程序更加容易。
2,hadoop的进程间交互都是通过RPC来进行的,比如NameNode与DataNode之间,Jobtracker与Tasktracker之间等。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。
可以说,Hadoop的运行就是建立在RPC的基础上的。
PRC的基本流程:
由上图可知,RPC采用了C/S的模式,Client段发送一个带有参数的请求信息到Server端,Server端接收到这个请求后,根据发送过来的参数调用相应的程序,然后把自己计算好的
结果发送给Client端,Client端接收到结果后继续运行。
RPC Client结构
主要的概念信息:
Client.ConnectionId:到RPC Server对象连接的标识。
Client.Call:Call调用信息
Client.ParallerlResult:Call响应
RPC.Invoker:对InvocationHandler的实现,提供invoke方法,实现RPC Client对RPC Server对象的调用。
RPC.Invocation:用来序列化和反序列化RPC Client的调用信息。(主要应用JAVA的反射机制和InputStream/OutputStream).
RPC Client主要流程
每一个Call都是由RPC Client发起,步骤说明:
1,RPC Client发起RPC Call。通过Java反射机制转化为对Client.call调用。
2,调用getConnection得到与RPC Server的连接。每一个RPC Client都维护一个HashMap结构的
到RPC Server的连接池。具体建立连接的流程见下图。
3,通过Connection将序列化后的参数发送到RPC服务端。
4,阻塞的方式等待RPC服务端返回响应。
RPC Server端的处理流程
下面主要说一下RPC在服务端的模型,它由一系列实体组成,分别负责调用的整个流程。
从图上看,各个实体分工明确,各司其职。
Listener
监听RPC server的端口,如果有客户端有连接请求到达,它就接受连接,然后把连接转发到某个Reader,让
Reader去读取那个连接的数据。如果有多个Reader的话,当有新连接过来时,就在这些Reader间顺序分发。这里需要提到的是,这里需要提到的是,Hadoop0.21版本在支持多Reader时有个bug(JIRA),如果有Reader在server运行期没被使用,Server进程不能正常关闭。
Reader
Reader的职责就是从某个客户端连接中读取数据流,然后把它转化成调用对象(Call),然后放到调用队列(call queue)里。
Handler
真正做事的实体。它从调用队列中获取调用信息,然后反射调用真正的对象,得到结果,然后
再把此次调用放到相应队列(response queue)里。
Responder
它不断地检查响应队列中是否有调用信息,如果有的话,就把调用的结果返回给客户端。
整个调用流程与网络有关的地方都是用NIO来处理的。
NIO
NIO(Non-Blocking I/O,java中也被New I/O),是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到
大型应用服务器,是解决高并发,I/O处理问题的有效方式。NIO支持面向缓冲区(Buffer)的,基于通道(Channel)的IO操作,NIO
将以更加高效的方式进行文件的读写操作。
NIO有三个重要的组件:
1,缓冲区Buffer
缓冲区有直接缓冲区和非直接缓冲区之分,它实际上也是一段内存空间。在NIO库中,所有的数据都是用缓冲区处理的。
在读取数据时,它是直接读到缓冲区中的,在写入数据时,他也是写入到缓冲区中的。
2,通道Channel
Client端与Server端的同步:
客户端发起的RPC调用是同步的,而服务端处理RPC调用是异步的。客户端调用线程以
阻塞同步的方式发起RPC连接及RPC调用,将参数等信息发送给listener,然后等待Connection接收
响应返回。
Listener负责接收RPC连接和RPC数据,当一个Call的数据接收完后,组装成Call,并将Call放入由Handler
提供的Call队列中。
Handler线程监听Call队列,如果Call队列不为空,则按FIFO方式取出Call,并转为实际调用,以非阻塞方式
将响应发回给Connection,未发送完毕的响应交给Responder处理。
参考资料:
作者:周旭龙 http://edisonchou.cnblogs.com/
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
)
标签:lis key 基于 handle puts 导致 ken 备份 参考资料
原文地址:https://www.cnblogs.com/zh-yy/p/13603947.html