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

hdfs

可以使用 Explorer 的 50070 端口,查看 NameNode

host - yuzhouwan

通过 FileSystem 的 get(uri, conf, user) 初始化 FS

FileSystem

抽象类 FileSystem 拥有 13 个子类

FileSystems

加载配置文件,并给相应属性赋值

FileSystem.get(uri,conf,user)

反射 org.apache.hadoop.hdfs.DistributedFileSystem

ReflectionUtils.newInstance--DFS

调用 initialize(uri, conf) 初始化 DFS

DFS.initialize

获得 DFSClient 代理

DFSClient(nameNodeUri,rpcNamenode,conf,stats)

创建代理

Proxy

让 DFSClient 持有 uri、conf、statistics

DFSClient

解析 uri

URI.create

根据用户组信息中的简单用户名,获取工作路径

DFS.getHomeDirectory

FileSystem 完成初始化

DFS-is-ok!!!

利用 FS.open(path) 打开读取流

DistributedFileSystem

解析 path

Path

装饰 open() 方法

FSDataInputStream--open(path)

FileSystemLinkResolver 回调函数

DFS.open(f,bufferSize)

HdfsDataInputStream 读取流

HdfsDataInputStream

FileOutputStream 写入流

FileOutputStream

缓冲池

buffSize

IOUtils 封装的拷贝方法

IOUtiles.copyBytes(in,out,buffSize)

Download over!

RPC-success

自己实现一套 RPC 系统

Full code is here.

欢迎加入我们的技术群,一起交流学习

群名称 群号
人工智能(高级)
人工智能(进阶)
BigData
算法