01.HDFS通信协议概述

HDFS通信协议

HDFS作为一个分布式文件系统,它的某些流程是非常复杂的,常常涉及Datanode、Namenode、Client三者之间的配合、相互调用才能实现,为了降低节点间代码的耦合性,提高单个节点代码的内聚性,HDFS将这些节点间的调用抽象成不同的接口

HDFS节点间的接口主要有两种类型

一是Hadoop RPC接口,HDFS中基于Hadoop RPC框架实现的接口

二是流式接口,HDFS中基于TCP或者HTTP实现的接口

HDFS通信协议抽象了HDFS各个节点之间的调用接口

Hadoop RPC接口

Hadoop RPC调用使得HDFS进程能够像本地调用一样调用另一个进程中的方法,并且可以传递Java基本数据类型或者自定义类作为参数,同时接收返回值。如果远程调用过程中出现异常,本地进程也会收到对应的异常。目前Hadoop RPC调用是基于Protobuf实现的,先看看Hadoop RPC接口的定义。Hadoop RPC接口主要定义在org.apache.hadoop.hdfs.protocol包和org.apache.hadoop.hdfs.server.protocol包中,包括以下几个接口

  1. ClientProtocol,这个接口定义了客户端与Namenode间的接口,定义的方法很对,客户端对文件系统的所有操作都需要通过这个接口,同时客户端读、写文件等操作也需要先通过这个接口与Namenode协商之后,再进行数据块的读取和写入操作

  2. ClientDatanodeProtocol,客户端与Datanode间的接口,定义的方法主要用于客户端获取数据节点信息时调用,而真正的数据读写交互则是通过流式接口进行的

  3. DatanodeProtocol,Datanode通过这个接口与Namenode通信,同时Namenode会通过这个接口中方法的返回值向数据节点下发指令,这是Namenode与Datanode节点通信的唯一方法,这个接口很重要,Datanode会通过这个接口向Namenode注册、汇报数据块的全量以及增量的存储情况。同时,Datanode也会通过这个接口中方法的返回值,将Datanode节点指令带回该数据块,根据这些指令,数据节点会执行数据块的复制、删除以及恢复操作

  4. InterDatanodeProtocol,Datanode与Datanode间的接口,Datanode会通过这个接口和其他Datanode通信,这个接口主要用于数据块的恢复操作,以及同步Datanode上存储的数据块副本的信息

  5. NameNodeProtocol,SecondNamenode与Namenode间的接口,因为Hadoop2.X中引入了HA机制,checkPoint操作不再由SecondNamenode执行了,所以这个接口就忽略吧

  6. 其他接口,比如安全相关接口(RefreshAuthorizationPolicyProtocol,RefreshUserMappingsProtocol,位于org.apache.hadoop.security包),HA相关接口(HAServiceProtocol,位于org.apache.hadoop.ha包)

流式接口

流式接口是HDFS中基于TCP或者HTTP实现的接口,在HDFS中,流式接口包括了基于TCP的DataTransferProrocol接口,以及HA架构中Active Namenode和Standby Namenode之间的HTTP接口

DataTransferProrocol是用来描述写入或者读出Datanode上数据的基于TCP的流式接口,HDFS客户端与Datanode以及Datanode与Datanode之间的数据块的传输就是基于DataTransferProrocol接口实现的。HDFS没有采用Hadoop RPC来实现HDFS文件的读写功能,是因为Hadoop RPC框架的效率目前还不足以支撑超大文件的读写,而使用基于TCP的流式接口有利于批量处理数据,同时提高了数据的吞吐量

Namenode会定期将文件系统的命名空间(文件目录树、文件/目录元信息)保存到一个名叫fsimage的文件中,以防止Namenode掉电或者进程崩溃。但如果Namenode实时地将内存中的命名零件同步到fsimage文件中,将会非常地消费资源且造成Namenode运行缓慢。所以Namenode会先将命名空间的修改操作保存在editlog文件中,然后定期合并fsimage和editlog文件

合并fsimage和editlog文件是非常消耗资源的,所以在Hadoop 2.X版本之前,HDFS引入了SecondNamenode专门负责合并fsimage和editlog。而在Hadoop 2.X版本中,由于Standby Namenode会不断地将读入的editlog与当前的命名空间合并,从而保持着一个最新版本的命名空间,所以Standby Namenode只需要定期将自己的命名空间写入一个新的fsimage文件,并通过HTTP协议将这个fsimage传回Active Namenode即可

Active Namenode和Standby Namenode之间的HTTP接口就是用来传输这个新的fsimage文件的,Standby Namenode成功地将自己的命令空间写入新的fsimage文件后,就会向Active Namenode的ImageServlet发送HTTP GET请求/getimage?putimage=1。这个请求的URL中包括了新的fsimage文件的事务ID,以及Standby Namenode用于下载的端口和IP地址。Active Namenode收到这个请求后,会根据Standby Namenode提供的信息向Standby Namenode的ImageServlet发起HTTP GET请求下载fsimage文件

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值