Hadoop IPC分析 (基于v0.1.0)
抽象类,由RPC.Server实现了Writable call(Writable param)方法。
通过RPC.getServer()方法被调用,然后start()线程。
从业务上看,会启动server线程的地方有三处:
1. TaskTracker 2. JobTracker 3. NameNode
Server类的属性如下:
1. ThreadLocal SERVER; // 为线程局部变量
2. int port; // 端口
3. int handlerCount; // handler数量,dfs.namenode.handler.count,默认为10
4. int maxQueuedCalls; // 大小同handlerCount
5. Class paramClass; // 参数信息类,RPC.Invocation.class
6. Configuration conf; // 配置信息
7. int timeout; // ipc.client.timeout,默认10000
8. boolean running; // 状态位
9. LinkedList callQueue; // 请求队列
10. Object callDequeued; // 锁
Call类封装了client call id、参数和连接对象。
Connection类为线程类,封装了连接的信息,包括socket、in和out。启动后读取client call id和参数信息,生成Call对象,加入callQueue队列。
Listener类为daemon线程类,封装了socket信息,监听port端口,一个Listener对应一个Connection。
以上三个类的包含关系为: Listener -> Connection -> Call
Handler类为daemon线程类,循环读取callQueue请求队列,获取请求后,Writable value = call(call.param);然后将结果写到输出流中。
一个Server由一个Listener和多个Handler组成。