hdfs读写数据操作分析总结

    

     HDFS适合一次写入,多次读取,满足高吞吐量需求而非低延迟,客户端与namenode的协商,此过程主要是namenode要进行一系列的检查,看是否存在该文件,如果所有的检查都通过,则在文件系统中生成一个新文件记录。剩下的部分主要是客户端直接与datanode通信,发送或接收数据。

写操作:BlockReceiver作为处理writeBlock时候的主要类。写是通过管道实现的,写block可能是用户请求也可能是NameNode要求的block拷贝命令,不同情况处理不同。管道上的中间节点有四个方向的网络数据流,如图1所示。还有两个写block数据文件和校验文件的流。主线程负责读数据报直接转发给下一个DataNode,而单独启动新线程PacketResponder用来处理给上级的回复消息和接受下级的发送过来的消息。PacketResponder应用心跳机制,到一定时间会给上级发送心跳,这样只要最后一个DataNode按时发送心跳即可,其他的中间DataNode只要收到心跳并且转发就可以了,最大的上级就可以知道整个链路的情况。由此可知最后一个DataNode节点的PacketResponder应该向上级发送两种信息:心跳和完成写入的包,而中间节点收到下级节点发送的包序号时要和自己写入完成的包序号做比较从而保证整个链路写入的正确性。

图1 DataNode数据流

其中mirrorOut表示向下级datanode发送数据包的输出流,mirrorIn表示接收下级节点发送的应答请求,replyOut表示向上级datanode发送应答的输出流,in表法接收数据的流。

最后一个datanode是如何处理每个packet的:

§             如果ackQueue中没有元素,先等待一段时间,如果距上次发送心跳的时间间距超过某阈值,发送心跳给上游的datanode,重复以上操作直到ackQueue不为空

§             如果当前packet是最后一个,finalize数据块,并通知datanode接收完数据块

§             发送ACK给上游的datanode

如果不是最后一个datanode又是如何处理的:

接收下游datanode的ACK

如果是心跳ACK,直接发送给上游datanode,接着处理下个packet

如果非心跳ACK,先检查接收到的ACK的packet编号和当前队列中第一个元素的packet编号是否一致

如果当前packet是最后一个,finalize数据块,并通知datanode接收完数据块

构造ACK消息,replies的第一个元素是自己的状态,值为OP_STATUS_SUCCESS,如果没有收到下游datanode的ACK,其它元素的值为OP_STATUS_ERROR,否则其它元素的值为接收到的原值

将ACK消息发送给上游datanode

如果ACK有错,中止PacketResponder的运行

读数据操作

Datanode只进行一次磁盘写入的原因:

Client发起数据写入请求时,file被切分成一个个block,而每个block又被分成是一块块的chunk,datanode接收数据是以chunk为单位,一包一包收的。当Datanode收到一包chunk时,并不是立马io操作,而是先缓存在本地,当收到的packet是最后一包数据时,便会finalize数据块,此时才会进行磁盘io操作,告知Datanode一个数据块接收完毕。也即当收完一个block的所有chunk后,才进行一次写磁盘操作,其间是不进行io的,每进行一次io的代价实在是太大了。

 

参考:http://blog.jeoygin.org/2012/03/hdfs-source-analysis-datanode-block-read-write.html

             http://blog.csdn.net/zhanglizhe_cool/article/details/5725604

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值