hadoop的RPC机制

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

Channel(通道)表示到实体如硬件设备、文件、网络套接字或可以执行一个或多个不同I/O操作的程序组件的开放的连接。
Channel和传统IO中的Stream很相似。主要区别为:通道是双向的,通过一个Channel既可以进行读,也可以进行写;而Stream只能进行单向操作,通过一个Stream只能进行读或者写,比如InputStream只能进行读取操作,OutputStream只能进行写操作;通道是一个对象,通过它可以读取和写入数据,当然了所有数据都通过Buffer对象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

3,选择器Selector
Selector类是NIO的核心类,Selector(选择器)选择器提供了选择已经就绪的任务的能力。Selector会不断的轮询注册在上面的所有channel,如果某个channel为读写等事件做好准备,那么就处于就绪状态,通过Selector可以不断轮询发现出就绪的channel,进行后续的IO操作。一个Selector能够同时轮询多个channel。这样,一个单独的线程就可以管理多个channel,从而管理多个网络连接。这样就不用为每一个连接都创建一个线程,同时也避免了多线程之间上下文切换导致的开销。
与Selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这2个类构成了服务端处理业务的关键逻辑。

 

 

 

 

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

天翼云-数据库,限时特惠2.8折起

广告 【天翼云】MySQL数据库提供单机,主备,只读三种实例类型,提供备份,恢复,扩容,监控 查看详情 >

对象的调用。

RPC.Invocation

:用来序列化和反序列化

RPC Client

的调用信息。

(主要应用

JAVA

的反射

机制和

InputStream/OutputStream

posted @ 2020-09-02 20:21  yy-yy  阅读(259)  评论(0编辑  收藏  举报