一: RPC的基础概念

  RPC,即Remote Procdure Call,中文名:远程过程调用

  (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

  (2)Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。

三、Hadoop的RPC框架运行机制

因此,可以说:Hadoop的运行就是建立在RPC基础之上的



二:RPC的显著特点

  (1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样

  (2)高性能:RPC Server能够并发处理多个来自Client的请求;

  (3)可控性:jdk中已经提供了一个RPC框架—RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架。



三: RPC的基本流程

三、Hadoop的RPC框架运行机制

  (1)RPC采用了C/S的模式;

  (2)Client端发送一个带有参数的请求信息到Server;

  (3)Server接收到这个请求以后,根据发送过来的参数调用相应的程序,然后把自己计算好的结果发送给Client端;

  (4)Client端接收到结果后继续运行;

三、Hadoop的RPC框架运行机制三、Hadoop的RPC框架运行机制



四: Hadoop中的RPC机制

  同其他RPC框架一样,Hadoop RPC分为四个部分:

  (1)序列化层:Client与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;

  (2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;

  (3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;

  (4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;


  Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时,DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。

三、Hadoop的RPC框架运行机制

三、Hadoop的RPC框架运行机制


五: Hadoop RPC设计技术

  (1)动态代理

About:动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象。目前Java开发包中提供了对动态代理的支持,但现在只支持对接口的实现

  (2)反射——动态加载类

  (3)序列化

  (4)非阻塞的异步IO(NIO

Java NIO原理请参考阅读:http://weixiaolu.iteye.com/blog/1479656




六、如何使用RPC


A、 Hadoop RPC对外提供的接口

  Hadoop RPC对外主要提供了两种接口(见类org.apache.hadoop.ipc.RPC),分别是:

  (1)public static <T> ProtocolProxy <T> getProxy/waitForProxy(…)

  构造一个客户端代理对象(该对象实现了某个协议),用于向服务器发送RPC请求。

  (2)public static Server RPC.Builder (Configuration).build()

  为某个协议(实际上是Java接口)实例构造一个服务器对象,用于处理客户端发送的请求。


B、 使用Hadoop RPC的四大步骤

  (1)定义RPC协议

  RPC协议是客户端和服务器端之间的通信接口,它定义了服务器端对外提供的服务接口。

  (2)实现RPC协议

  Hadoop RPC协议通常是一个Java接口,用户需要实现该接口。

  (3)构造和启动RPC SERVER

  直接使用静态类Builder构造一个RPC Server,并调用函数start()启动该Server。

  (4)构造RPC Client并发送请求

  使用静态方法getProxy构造客户端代理对象,直接通过代理对象调用远程端的方法。



七:实例

Hadoop的RPC框架应用示例

相关文章: