Hadoop 源代码分析(六)RPC-Client

既然是RPC,天然就有客户端和服务器,固然,org.apache.hadoop.rpc 也就有了类Client 和类Server。在这里咱们来仔细考
察org.apache.hadoop.rpc.Client。下面的图包含了org.apache.hadoop.rpc.Client 中的关键类和关键方法。
因为Client 可能和多个Server 通讯,典型的一次HDFS 读,须要和NameNode 打交道,也须要和某个/某些DataNode 通讯。这
就意味着某一个Client 须要维护多个链接。同时,为了减小没必要要的链接,如今Client 的作法是拿ConnectionId(图中最右
侧)来作为Connection 的ID。ConnectionId 包括一个InetSocketAddress(IP 地址+端口号或主机名+端口号)对象和一个用
户信息对象。这就是说,同一个用户到同一个InetSocketAddress 的通讯将共享同一个链接。
 

链接被封装在类Client.Connection 中,全部的RPC 调用,都是经过Connection,进行通讯。一个RPC 调用,天然有输入参数,
输出参数和可能的异常,同时,为了区分在同一个Connection 上的不一样调用,每一个调用都有惟一的id。调用是否结束也须要
一个标记,全部的这些都体如今对象Client.Call 中。Connection 对象经过一个Hash 表,维护在这个链接上的全部Call:
Java 代码
1. private Hashtable<Integer, Call> calls = new Hashtable<Integer, Call>();
一个RPC 调用经过addCall,把请求加到Connection 里。为了可以在这个框架上传输Java 的基本类型,String 和Writable 接
口的实现类,以及元素为以上类型的数组,咱们通常把Call 须要的参数打包成为ObjectWritable 对象。
Client.Connection 会经过socket 链接服务器,链接成功后回校验客户端/服务器的版本号(Client.ConnectionwriteHeader()方
法),校验成功后就能够经过Writable 对象来进行请求的发送/应答了。注意,每一个Client.Connection 会起一个线程,不断
去读取socket,并将收到的结果解包,找出对应的Call,设置Call 并通知结果已经获取。
Call 使用Obejct 的wait 和notify,把RPC 上的异步消息交互转成同步调用。
还有一点须要注意,一个Client 会有多个Client.Connection,这是一个很天然的结果。web

相关文章
相关标签/搜索