Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15792
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-08 14:16
文章分类
文章存档

2015年(9)

我的朋友

分类: HADOOP

2015-05-08 14:50:29

既然是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 calls = new Hashtable();
一个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,这是一个很自然的结果。
更多精彩内容请访问:
关注超人学院微信:BJ-CRXY
阅读(620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~