Hadoop文件写入详细剖析(22)

原创
2014/03/09 21:28
阅读数 94


            客户端通过对DistibutedFileSystem对象调用create()函数来创建文件(步骤1).DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件,此时该文件中还没有相应的数据块(步骤2)。namenode执行各种不同的检查以确保个文件不存在,并且客户端有创建该文件的权限。如果这些检查均通过,namenode就会创建新文件记录一条记录;否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。就像读取事件一样,FSDataOutputStream封装一个DFSOutputStream对象,该对象负责处理datanode和namenode之间的通信。

                在客户端写入数据时(步骤3),DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为“数据队列”(data queue).DataStream处理数据列表,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据备份。这一组datanode构成一个管线----我们假设复本数为3,所以管线中有3个节点.DataStreamer将数据包流式传输到管线中第一个datanode,该datanode存储数据包并将它发送到管线中的第2个datanode。同样地,第2个datanode存储该数据包并且发送给管线中的第3个(也就是最后一个)datanode(步骤4).DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,称为”确认队列“(ack queue).当收到管道中所有datanode确认信息后,该数据包才会从确认队列删除(步骤5)。

                如果在数据写入期间,datanode发生故障,则执行以下操作,这对于写入数据的客户端是透明的,首先关闭管线,确认把队列中的任何数据包都添加回数据队列的最前端,以确认故障节点下游的datanode不会漏掉任何一个数据包。为存储在另一正常datanode的当前数据块指定一个新的标识,并将该标识传送给namenode,以便datanode在恢复后可以删除存储的部分数据块。从管线中删除故障数据节点并且把余下的数据块写入管线中的两个正常的datanode。namenode注意到块复本量不足时,会在另一个节点创建一个新的复本。后续的数据块继续正常接受处理。

                在一个块被写入期间可能会有多个datanode同时发生故障,但非常少见,只要写入了dfs.replication.min的复本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication的默认值为3)。客户端完成数据的写入后,会对数据流调用close()方法(步骤6),该操作将剩余的所有数据包写入datanode管线中,并在联系namenode且发送文件写入完成信号之前,等待确认(步骤7),namenode已经知道文件由哪些块组成(通过DataStreamer询问数据库的分配),所以它在返回成功前只需要等待数据块进行最小量的复制。


                                                                                                                                    Name:Xr

                                                                                                                                    Date:2014-03-09 21:28

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部