在Hadoop中为了方便集群中各个组件之间的通信,它采用了RPC,当然为了提高组件之间的通信效率以及考虑到组件自身的负载等情况,Hadoop在其内部实现了一个基于IPC模型的RPC。关于这个RPC组件的整体情况我已绍经在前面的博文中介绍过了。而在本文,我将结合源代码详细地介绍它在客户端的实现。
先来看看与RPC客户端相关联的一些类吧!
1.Client类
- private Hashtable<ConnectionId, Connection> connections = new Hashtable<ConnectionId, Connection>(); //与远程服务器连接的缓存池
- private Class<? extends Writable> valueClass; //远程方法调用发回后返回值解析器
- final private int maxIdleTime; //连接的最大空闲时间
- final private int maxRetries; //Socket连接时,最大Retry次数
- private boolean tcpNoDelay; //设置TCP连接是否延迟
- private int pingInterval; //ping服务端的间隔
2.Call类
- int id; // 调用标示ID
- Writable param; // 调用参数
- Writable value; // 调用返回的值
- IOException error; // 异常信息
- boolean done; // 调用是否完成
- private String methodName; //方法名
- private Class[] parameterClasses; //参数类型集合
- private Object[] parameters; //参数值
3.ConnectionId类
- InetSocketAddress address;//连接实例的Socket地址
- GroupInformation ticket;//客户端用户信息
- Class<?> protocol;//连接的协议
4.Connection类
- private InetSocketAddress server; // 服务端ip:port
- private ConnectionHeader header; // 连接头信息,该实体类封装了连接协议与用户信息UserGroupInformation
- private ConnectionId remoteId; // 连接ID
- private Socket socket = null; // 客户端已连接的Socket
- private DataInputStream in;
- private DataOutputStream out;
- private Hashtable<Integer, Call> calls = new Hashtable<Integer, Call>(); //待处理的RPC队列
- private AtomicLong lastActivity = new AtomicLong();// 最后I/O活跃的时间
- private AtomicBoolean shouldCloseConnection = new AtomicBoolean(); //连接是否关闭
- private IOException closeException; //连接关闭原因
hrpc:hadoop的RPC实现标识;
version:协议的版本号;
length:剩余信息长度;
protocol:协议类型;
flag:是否有客户端信息;
ugi:客户端信息;
客户端的一次RPC调用的处理过程如下图:
Client为客户设计了两种调用接口,一种是单个RPC调用接口,一种是批量的RPC调用,如下:
- public Writable call(Writable param, InetSocketAddress addr, Class<?> protocol, UserGroupInformation ticket) throws InterruptedException, IOException
- public Writable[] call(Writable[] params, InetSocketAddress[] addresses, Class<?> protocol, UserGroupInformation ticket) throws IOException