HDFS2.x之RPC流程分析

HDFS2.x之RPC流程分析1 概述

Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信。RPC是整个Hadoop中通信框架的核心,目前采用ProtocolBuf作为RPC的默认实现。RPC的整体调用流程如下:

2 Protobuf

Protocol buffer(以下简称PB),PB是Google开源的一种轻便高效的结构化数据存储格式,可以用于结构化数据的序列化和反序列化,很适合做数据存储或 RPC 数据交换格式,目前提供了 C++、Java、Python 三种语言的 API。序列化/反序列化速度快,服务器空间,网络或者磁盘IO传输的数据少。

RPC就是一台机器上的某个进程要调用另外一台机器上的某个进程的方法,服务器空间,中间通信传输的就是类似于“方法名、参数1、参数2……”这样的信息,是结构化的。

我们要定义一种PB实现的RPC传输格式,首先要定义相应的.proto文件,在Hadoop common工程里,这些文件放在hadoop-common\src\main\proto目录下;在Hadoop HDFS工程里这些文件放在hadoop-hdfs\src\main\proto目录下,以此类推。Hadoop编译脚本会调用相应的protoc二进制程序来编译这些以.proto结尾的文件,生成相应的.java文件。

由proto文件生成的类,均提供了读写二进制数据的方法:

(1)byte[] toByteArray():序列化message并且返回一个原始字节类型的字节数组;

(2)static Person parseFrom(byte[] data): 将给定的字节数组解析为message;

(3)void writeTo(OutputStream output): 将序列化后的message写入到输出流;

(4)static Person parseFrom(InputStream input): 读入并且将输入流解析为一个message;

另外,PB类中都有一些Builder子类,利用其中的build方法,可以完成对象的创建。PB的具体应用会在下面的RPC的Client和Server的分析中说明。

3 RPC Client端

以create方法为例,来说明RPC的具体执行流程。首先看下在Client端的执行过程。

由HDFS客户端发起的create操作,在经过一系列的前置步骤之后,虚拟主机,会通过DFSClient类中的namenode代理来完成,其定义如下:

final ClientProtocol namenode;……NameNodeProxies.ProxyAndInfo<ClientProtocol> proxyInfo =NameNodeProxies.createProxy(conf, nameNodeUri, ClientProtocol.class);this.dtService = proxyInfo.getDelegationTokenService();this.namenode = proxyInfo.getProxy();做对的事情比把事情做对重要。

HDFS2.x之RPC流程分析

相关文章:

你感兴趣的文章:

标签云: