标签:
第六章 HDFS概述方法执行成功后,返回一个LocatedBlock对象。该对象包含了新数据块的数据块标识和版本号,同时它的成员变量LocatedBlock.locks
提供了数据流管道的信息,通过上述信息,DFSOutputStream就可以和数据节点联系,通过写数据接口建立数据流管道。客户端写入
FSDataOutputStream流中的数据,被分成一个一个的文件包,放入DFSOutputStream对象的内部队列。该队列中的文件包最后打包成
数据包,发往数据流管道,流经管道上的各个数据节点并持久化,确认包逆流而上,从数据管道依次发往客户端,当客户端收到应答时,
它将对应的包从内部队列移除。
DFSOutputStream在写完一个数据块后,数据流管道上的节点,会通过和名字节点的DatanodeProtocol远程接口的blockReceived()方法
向名字节点提交数据块。如果数据队列中还有等待输出的数据,DFSOutputStream对象需要再次调用addBlock()方法,为文件添加新的数据
块。客户端完成数据的写入后,调用close()方法关闭流,当DFSOutputStream数据队列中的文件包都收到应答后,就可以使用ClientProtocol.complete()
方法通知名字节点关闭文件,完成文件写流程。
如果文件数据写入期间,数据节点发生故障,则会执行以下操作:首先数据管道会被关闭,已经发送到数据管道但还没有收到确认包
的文件包,会重新添加到DFSOutputStream的输出队列。当前正常工作的数据节点上的数据块会被赋予一个新的版本号,并通知名字节点
这样失败的数据节点从故障中恢复过来以后,上面只有部分数据的数据块会因为数据块版本和名字节点保存的版本号不一致而删除。
然后,在数据流管道中删除错误数据节点并重新建立管道,并正常写数据到正常工作的数据节点。文件关闭后,名字节点会发现该数据块的
副本数没有达到要求,会选择一个新的数据节点并复制数据块,创建新的副本。数据节点故障只会影响一个数据块的写操作,后续数据块
写入不会受到影响。数据块写入过程中可能出现多于一个数据节点出现故障的情况,这时只要数据管道中的数据节点数满足配置项${dfs.replication.min}的
值(默认值是1),就认为写操作是成功的。
标签:
原文地址:http://blog.csdn.net/yonghutwo/article/details/51733467