hadoop ipc.Client

Hadoop IPC分析 (基于v0.1.0)

Client类逻辑上为单例,仅可能由RPC.getProxy()RPC.call()创建。

使用方法如下,Client被封装在getProxy()方法内部,对业务透明。

XXXProtocol xxx = (XXXProtocol) RPC.getProxy(XXXProtocol.class,   
        new InetSocketAddress(port), conf);
xxx.xxx();

RPC.getProxy()方法通过代理方式调用Client.call(),参见以下code。

Proxy.newProxyInstance(protocol.getClassLoader(),
        new Class[] { protocol },
        new Invoker(addr, conf));
public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
    ObjectWritable value = (ObjectWritable) CLIENT.call(
            new Invocation(method, args), address);
    return value.get();
}
call()方法的逻辑顺序分别为:

1. 从连接池connections中根据address获取server的连接,如无则创建并扔回连接池中

2. 启动connection线程

3. 构造Call类,包含call id、参数、返回值、错误信息和状态信息等

4. connection.sendParam(call),该方法往connection的输出流写信息,将本次call添加至calls

5. server端bla..bla..bla..,主要为读取输入流,反射调用方法,写输出流

6. connection读取输入流,获取call id,将这次call从calls中删除,结果和状态记录回call对象,最后做挂起线程等清理工作

7. 返回call.value


补充说明一下Connection内部类,该类为一个线程,封装了Client->Server的调用逻辑和I/O等细节,具体为:

// IP|hostname + port
private InetSocketAddress address;
// socket
private Socket socket;
// server response info, value.readFields(in);
private DataInputStream in;
// request info, call.param.write(out);
private DataOutputStream out;
// 尚未获得返回信息和超时的call集合
private Hashtable calls = new Hashtable();
// 对应in
private Call readingCall;
// 对应out
private Call writingCall;
最后是ParallelCall和ParallelResults类,处理并行请求,由RPC.call()->Client.call()调用

你可能感兴趣的:(Hadoop)