HDFS文件写入时数据流

客户端及与之交互的HDFS、namenode和datanode之间的数据流

HDFS文件写入

1.客户端通过对DistributedFileSystem对象调用create()函数来新建文件。

2.DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中新建一个文件,此时该文件中还没有相应的数据块。namenode执行各种不同的检查以确保这个文件不存在及客户端有新建该文件的权限。如果这些检查均通过,namenode就会为创建新文件记录一条记录。

3.DistributedFileSystem返回给客户端一个FSDataOutputStream对象,FSDataOutputStream对象封装一个DFSoutPutstream对象,负责处理namenode和datanode之间的通信,客户端开始写入数据。

4.在客户端写入数据时,FSDataOutputStream将数据分成一个一个的数据包,写入内部队列“数据队列(data queue)”。DataStreamer处理数据队列,它的责任是挑选出适合存储数据复本的一组datanode,并据此来要求namenode分配新的数据块。这一组datanode构成一个管线(我们假设复本数是3,所以管线中有3个节点。),DataStreamer将数据包流式传输到管线中第1个datanode,该datanode存储数据包并将它发送到管线中的第2个datanode。同样,第2个datanode存储该数据包并发送给管线中的第3个datanode。

5.DFSOutputStream维护着一个内部数据包队列来等待datanode的收到确认回执,称为“确认队列(ack queue)”。收到管道中所有datanode确认信息后,该数据包才会从确认队列删除。

6.客户端完成数据的写入,对数据流调用close()方法。

7.联系到namenode告知其文件写入完成,等待确认。namenode已经知道文件由哪些数据块组成(以为DataStreamer请求分配数据块),所以它在返回成功前只需要等待数据块进行最小量的复制。

 

附录
DFSOutputStream内部原理图

网上其他写的比较具体的博文,可以参考阅读下

HDFS写文件过程分析