Hadoop中的RPC

      Hadoop中的RPC是Hadoop系统内部的通信机制,由于RPC采用客户机/服务器的模式,所以通信时一方为客户机,另一方为服务器。它的协议是一个Java接口,协议规定所有参数和返回类型都必须是:

    1)boolean, byte, char, short, int, long, float, double, void;

    2) String;

    3) Writable;

    4) 上面几种类型的数组;

    假设这样的一种通信:客户机C向服务器S发出通信请求,其中可能存在多个请求。通信流程如下:

    首先,RPC客户机发出一个RPC调用,JAVA反射机制将该调用转化为对client.call的调用。

   然后,建立到S的连接,通过getConnection方法获取连接,如果ConnctionId已存在,直接将此连接返回;否则根据ConnectionId新建一个连接。其中,ConnctionId是Client的内部类,包含S的地址和用户信息,通过<地址,协议,用户>来唯一标识一个C到S的连接。连接之后,就由Connection将Call的相关参数信息序列化,并发送给S。接着就等待服务器的响应直到Call结束。如果中间出错,就会中断线程。

   接着,就是S执行相应的操作。C和S之间通信是通过Socket完成的。S使用Listener线程循环等待RPC客户端的发送数据过来,当有数据可读的时候,doRead方法调用Connection的readAndProcess方法。Connection边接收边对数据进行处理(processData方法读取数据,并构建Call),如果接收到一个完整的Call包,则构建一个Call对象,并将这个Call对象PUSH到Call队列中,由Handler线程来处理Call队列中的所有Call。

   然后,Handler线程处理Call队列(Handler是Server的内部类,继承java.lang.Thread)。Call队列是用java.util.concurrent.BlockingQueue存储,处理Call作业时采用简单的FIFO(先进先出)的方法,作业为空时,进程进入wait状态。最后返回响应时,由于响应需要通过SOCKET返回给C,所以响应的类型必须是Writable

RPC各线程之间调用关系(来自http://bbs.hadoopor.com/thread-329-1-2.html):