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,这是一个很自然的结果。

关注超人学院微信:BJ-CRXY

更多精彩内容请访问:http://bbs.superwu.cn

时间: 2024-08-25 19:38:05

Hadoop 源代码分析(六)RPC-Client的相关文章

Hadoop源代码分析

关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.html GFS:http://labs.google.com/papers/gfs.html BigTable:http://labs.googl

Hadoop源代码分析(完整版)-转载

Hadoop源代码分析(一) http://blog.csdn.net/huoyunshen88/article/details/8611629 关键字: 分布式云计算 Google的核心竞争技术是它的计算平台.Google的大牛们用了下面5篇文章,介绍了它们的计算设施. GoogleCluster:http://research.google.com/archive/googlecluster.html Chubby:http://labs.google.com/papers/chubby.h

Hadoop源代码分析(MapTask辅助类 I)

Hadoop源代码分析(MapTask辅助类 I)MapTask的辅劣类主要针对Mapper的输入和输出.首先我们来看MapTask中用的的Mapper输入,在类图中,返部分位于右上角.MapTask.TrackedRecordReader是一个Wrapper,在原有输入RecordReader的基础上,添加了收集上报统计数据的功能.MapTask.SkippingRecordReader也是一个Wrapper,它在MapTask.TrackedRecordReader的基础上,添加了忽略部分输

Hadoop 源代码分析(五)RPC 框架

介绍完org.apache.hadoop.io 以后,我们开始来分析org.apache.hadoop.rpc.RPC 采用客户机/服务器模式.请求程序就是一个客户机,而服务提供程序就是一个服务器.当我们讨论HDFS 的,通信可能发生在: Client-NameNode 之间,其中NameNode 是服务器 Client-DataNode 之间,其中DataNode 是服务器 DataNode-NameNode 之间,其中NameNode 是服务器 DataNode-DateNode 之间,其中

Hadoop 源代码分析(七)RPC-Server

聊完了Client 聊Server,按惯例,先把类图贴出来. 需要注意的是,这里的Server 类是个抽象类,唯一抽象的地方,就是 Java 代码 1. public abstract Writable call(Writable param, long receiveTime) throws IOException; 这表明,Server 提供了一个架子,Server 的具体功能,需要具体类来完成.而具体类,当然就是实现call 方法. 我们先来分析Server.Call,和Client.Ca

Hadoop源代码分析(*IDs类和*Context类)

我们开始来分析Hadoop MapReduce的内部的运行机制.用户向Hadoop提交Job(作业),作业在JobTracker对象的控制下执行.Job被分解成为Task(任务),分发到集群中,在TaskTracker的控制下运行.Task包括MapTask和ReduceTask,是MapReduce的Map操作和Reduce操作执行的地方.这中任务分布的方法比较类似于HDFS中NameNode和DataNode的分工,NameNode对应的是JobTracker,DataNode对应的是Tas

Hadoop源代码分析(四零)

有了上面的基础,我们可以来解剖DFSOutputStream了.先看构造函数: privateDFSOutputStream(String src, longblockSize, Progressable progress, intbytesPerChecksum) throws IOException DFSOutputStream(String src, FsPermissionmasked, boolean overwrite, shortreplication, long blockSi

Hadoop源代码分析(MapReduce概论)

大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花很多的时间去介绍HDFS的背景,毕竟大家对文件系统的还是有一定的理解的,而且也有很好的文档.在分析Hadoop的MapReduce部分前,我们还是先了解系统是如何工作的,然后再进入我们的分析部分.下面的图来自http://horicky.blogspot.com/2008/11/hadoop-mapreduce-implementation.html,是我看到的讲MapReduce最好的图. 以Hadoop带的wordcount为例子(下面

Hadoop源代码分析(包hadoop.mapred中的MapReduce接口)

前面已经完成了对org.apache.hadoop.mapreduce的分析,这个包提供了Hadoop MapReduce部分的应用API,用于用户实现自己的MapReduce应用.但这些接口是给未来的MapReduce应用的,目前MapReduce框架还是使用老系统(参考补丁HADOOP-1230).下面我们来分析org.apache.hadoop.mapred,首先还是从mapred的MapReduce框架开始分析,下面的类图(灰色部分为标记为@Deprecated的类/接口): 我们把包m