sinv2015 发表于 2017-3-6 08:54:17

hadoop FileSystem和ClientProtocol的区别

在写MR程序时,我们都会用到hadoop.fs.FileSystem来实现HDFS文件读写。但是这几天在看HADOOP2.X源码分析,发现Hadoop RPC接口的ClientProtocol也有实现HDFS文件读写的功能,请问这两个有什么区别

easthome001 发表于 2017-3-6 09:49:26

首先我们需要知道hadoop通信是通过rpc的,所以关于hadoop操作文件,必定也需要通过rpc.所以猜测二者是调用关系,并非平行关系,也就是二者共同完成文件操作,而不是都具有操作文件的权限。楼主可能看到的分别是实现类及接口

更多内容

Hadoop RPC接口主要定义在org.apache.hadoop.hdfs.protocol包和org.apache.hadoop.hdfs.server.protocol包中,包括以下几个接口:

ClientProtocol:定义了客户端与名字节点间的接口,客户端对文件系统的所有操作都需要通过这个接口,同时客户端读、写文件等操作也需要先通过这个接口与Namenode协商之后,再进行数据块的读出和写入操作。
ClientDatanodeProtocol:客户端与数据节点间的接口。定义的方法主要是用于客户端获取数据节点信息时调用,而真正的数据读写交互则是通过流式接口进行。
DatanodeProtocol:数据节点通过这个接口与名字节点通信,同时名字节点会通过这个接口中方法的返回值向数据节点下发指令。这是名字节点与数据节点通信的唯一方式。数据节点会通过这个接口向名字节点注册、汇报数据块的全量以及增量的存储情况。同时,名字节点也会通过这个接口中方法的返回值,将名字节点指令带回该数据块,根据这些指令,数据节点会执行数据块的复制、删除以及恢复操作。
InterDatanodeProtocol:数据节点与数据节点间的接口,数据节点会通过这个接口和其他数据节点通信。这个接口主要用于数据块的恢复操作,以及同步数据节点存储的数据块副本的信息。
NamenodeProtocol:第二名字节点与名字节点间的接口。
其他接口:主要包括安全相关接口(RefreshAuthorizationPolicyProtocol、RefreshUserMappingsProtocol)、HA相关接口(HAServiceProtocol)等。

sinv2015 发表于 2017-3-6 10:14:52

我举个简单的例子,在我们程序实现中,比如我们要在HDFS上创建一个目录,我们调用的是FileSystem.mkdirs(),在其内部实现中,他则会调用ClientProtocol中的mkdirs来进行实现。我理解的对么

easthome001 发表于 2017-3-6 13:53:51

sinv2015 发表于 2017-3-6 10:14
我举个简单的例子,在我们程序实现中,比如我们要在HDFS上创建一个目录,我们调用的是FileSystem.mkdirs() ...

这里涉及到接口与类的关系。类可以实现接口,接口可以有多个实现类。
更多资料可以百度:
找找关于接口与类的关系

sinv2015 发表于 2017-3-6 15:57:05

接口与类的关系我都懂,但是我看了FileSystem类,他实现的接口并没有ClientProtocol。如下图

tntzbzc 发表于 2017-3-6 21:11:02

sinv2015 发表于 2017-3-6 15:57
接口与类的关系我都懂,但是我看了FileSystem类,他实现的接口并没有ClientProtocol。如下图


Hadoop RPC接口的ClientProtocol也有实现HDFS文件读写的功能你把认为的读写功能的代码贴出来看下

sinv2015 发表于 2017-3-16 18:20:37

tntzbzc 发表于 2017-3-6 21:11
你把认为的读写功能的代码贴出来看下

谢谢,我懂了,FileSystem调用之后,是通过ClientProtocol协议中的方法实现的。
页: [1]
查看完整版本: hadoop FileSystem和ClientProtocol的区别