这篇文章主要介绍“Hadoop RPC-Client 源代码分析”,在日常操作中,相信很多人在 Hadoop RPC-Client 源代码分析问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Hadoop RPC-Client 源代码分析”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
既然是 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,这是一个很自然的结果。
到此,关于“Hadoop RPC-Client 源代码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!