06. HDFS流式接口

DataTransferProtocol

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

DataTransferProtocol具有的方法如下图所示

13274599-1e2a57db34fcb12d.png
6. DataTransferProrocol方法.png

下面介绍下这几个方法

readBlock(),从当前Datanode读取指定的数据块

writeBlock(),将指定数据块写入数据流管道(pipeLine)中

transferBlock(),将指定数据块复制(transfer)到另一个Datanode上。数据块复制操作是指数据流管道中的Datanode出现故障,需要用新的Datanode替换异常的Datanode,DFSClient会调用这个方法将数据流管道中异常Datanode上已经写入的数据块复制到新添加的Datanode上

requestShortCircuitFds(),获取一个短路(short circuit)读取数据块的文件描述符

releaseShortCircuitFds(),释放一个短路读取数据块的文件描述符

requestShortCircuitShm(),获取保存短路读取数据块的共享内存

replaceBlock(),将从源Datanode复制来的数据块写入本地Datanode。写成功后通知Namenode,并且删除源Datanode上的数据块,这个方法主要用在数据块平衡操作(balancing)的场景下

copyBlock(),复制当前Datanode上的数据块,这个方法主要用在数据块平衡操作的场景下

blockChecksum(),获取指定数据块的校验值

DataTransferProtocol接口调用并没有使用Hadoop RPC框架提供的功能,而是定义了用于发送DataTransferProtocol请求的Sender类,以及用于响应DataTransferProtocol请求的Receiver类,Sender类和Receiver类都实现了DataTransferProtocol接口

下图给出了DataTransferProtocol接口的一个调用实例

13274599-a8262d805f5bbb1a.png
7. DataTransferProtocol调用实例.png

我们假设DFSClient发起了一个DataTransferProtocol.readBlock()操作,那么DFSClient会调用Sender将这个请求序列化,并传输给远端的Receiver。远端的Receiver接收到这个请求后,会反序列化请求,然后调用代码执行读取操作。

DataTransferProtocol接口具体实现,后面文章会有描述

Active Namenode和Standby Namenode之间的HTTP接口

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值