Hadoop RPC 源码领略
什么是 RPC?
In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system.
为什么要有 RPC?
地域性
当主机不可达时,通过远程调用可以使得终端操作目标机器成为可能
含糖性
底层的网络通信细节封装入 API,方便网络分布式系统的开发
模块化
在 Hadoop 分布式系统中,上层的分布式子系统(MapReduce、YARN、HDFS …)能够共用这个网络通信模块
Hadoop 的 RPC 调用链
这里我们以 “从 HDFS 下载一个文件” 为例
启动 Hadoop 集群的 DFS、YARN
可以使用 Explorer 的 50070 端口,查看 NameNode
通过 FileSystem 的 get(uri, conf, user) 初始化 FS
抽象类 FileSystem 拥有 13 个子类
加载配置文件,并给相应属性赋值
反射 org.apache.hadoop.hdfs.DistributedFileSystem
调用 initialize(uri, conf) 初始化 DFS
获得 DFSClient 代理
创建代理
让 DFSClient 持有 uri、conf、statistics
解析 uri
根据用户组信息中的简单用户名,获取工作路径
FileSystem 完成初始化
利用 FS.open(path) 打开读取流
解析 path
装饰 open() 方法
FileSystemLinkResolver 回调函数
HdfsDataInputStream 读取流
FileOutputStream 写入流
缓冲池
IOUtils 封装的拷贝方法
Download over!
自己实现一套 RPC 系统
Full code is here.