HDFS写文件

1、客户端通过调用DistributedFileSystem的create()方法,创建一个新文件,DistributedFileSystem通过RPC调用,在NameNode的文件系统命名空间中创建一个新文件,此时还没有相关的DataNode与之相关联

2、NameNode会通过多种验证保证新的文件不存在于文件系统中,并且确保请求客户端拥有创建文件的权限。当所有验证通过后,NameNode会创建一个新文件的记录,如果创建失败,则抛出一个IOException异常;如果成功,DistributedFileSystem返回一个FSDataOutputStream给客户端用于写入数据。FSDataOutputStream包含了一个DFSOutputStream,客户端用它来处理DataNode和NameNode之间的通信。

3、当客户端写入数据时,DFSOutputStream会将文件分成一个个的数据包(packet),然后放入一个内部队列中,称为”数据队列“。DataStream处理数据队列,它的责任是挑选出适合存储数据副本的一组DataNode,并请求NameNode分配新的DataNode。

     返回的DataNode列表形成一个“管道”,假设这里的副本数是3,那么这个管道中就会有3个DataNode, DataStreamer将文件包以流的方式传送给队列中的第一个DataNode。第一个DataNDode会存储这个包,然后将它推送到第二个DataNode中,随后照这样进行,直到管道中的最后一个DataNode。

4、DFSOutputStream同时也会保存一个包的内部队列,用来等待管道中的DataNode返回确认信息,这个队列被称为确认队列〔ack queue)。只有当所有管道中的DataNode都返回了写入成功的返回信息文件包,才会从确认队列中删除。


HDFS会考虑写入失败的情况

    当数据写入节点失败时,HDFS会做出以下反应:首先管道会被关闭,任何在确认队列中的数据包都会被添加到数据队列的前端,这样管道中失败的DataNode都不会丢失数据。当前存放在正常工作的DataNode之上的文件块会被赋予一个新的身份,井且和NameNode进行关联,这样,如果失败的DataNode过段时间后会从故障中恢复出来。其中的部分数据块就会被删除。然后,管道会把失败的DataNode删除,文件会继续被写到管道中的另外两个DataNode中。最后,NameNode会注意到现在的文件块副本数没有达到配置属性要求,会在另外的DataNode上重新安排创建一个副本,随后的文件会正常执行写入操作。

    在文件块写入期间,多个DataNode同时出现故障的可能性存在,但是很小。只要dfs.replicatinn.min的属性值(默认为1)成功写入,这个文件块就会被异步复制到集群的其他 DataNode中,直到满足dfs. rcplication. min的属性值(默认为3)。


    客户端成功完成数据写入的操作后,就会调用close()函数关闭数据流。这步操作会在连接NameNode确认文件写入完全之前将所有剩下的文件包放入DataNode管道,等待通知确认信息.NameNode会知道哪些块组成一个文件(通过DataStreamer获得块位置信息),这样NameNode只要在返回成功标志前等待块被最小量(dfs.replication.min )复制即可。








猜你喜欢

转载自blog.csdn.net/HYN205/article/details/80712850
今日推荐