HDFS文件写入

如图中所示,很多次听别人讲文件读写时,都没有说清楚那3个备份到底是如何完成的,从图中可以看出,客户端第一步调取call()方法在DistributedFileSystem,DistributedFileSystem使用RPC连接namenode来创建一个新的文件,并没有分配块。namenode检查文件是否存在,且用户是否有创建的权限。如果可以,namenode将会创建一条记录,否则抛出一个IOException.然后DistributedFileSystem返回一个FSDataOutPutStream给客户端开始写。FSDataOutPutStream封装了DFSOutPutStream来连接namenode和datanode.

当客户端写数据时,DFSOutputStream将它分解成包,将其写入一个称之为数据队列的内部队列,这个队列被DataStreamer消费,它也负责跟namenode申请合适的datanode存储数据块和存储备份。datanode列表组成了一个管道,DataStreamer将包内容流式给第一个节点,第一个传送给第二个,第二个传送给第三个。

DFSOutputStream也保持一个包的内部队列来等人datenode的确认,称之为确认队列,直到管道所有中的datenode都确认,才移除确认队列的包。

当写文件出错时,关闭管道,namenode会记录好的datenode,并重新创见一个管道去除坏的datenode 。

有一点不是很理解,它要将确认队列中的包加入到数据队列前段,那么新的datenode将会从失败的节点开始写,可是这时如果写入失败那个datenode坏了,那么不仍然有部分数据无法使用?

Hadoop备份策略,第一份在client节点上,如果client不在集群中,那么就随机选择一个节点。第二份在不同的机架上随机选择,第三份在第二份相同的机架上,但不同的节点。

 

posted @ 2016-03-03 12:12  dalu610  阅读(411)  评论(0编辑  收藏  举报