HDFS写文件流程

-
调用客户端的 DistributedFileSystem 的
create()方法; -
DistributedFileSystem 会发起对 namenode 的一个RPC连接,请求创建一个文件,不包含关于 block 块的请求。
namenode 会执行各种各样的检查,保证要创建的文件不存在,并且客户端有创建文件的权限。如果检查通过,
namenode 会创建一个文件(在edits中,同时更新内存状态),否则创建失败,客户端抛异常IOException。 -
DistributeFileSystem 返回一个 FSDataOutputStream 对象给客户端用于写数据。
FSDataOutputStream 封装了一个 DFSOutpetStream 对象负责客户端跟 datanode 以及 namenode 的通信。 -
FSDateOutputStream对象将数据切分为小的数据包(64kb,core–default.xml:file.client-write-packet-size默认值65536),并写入一个内部队列(
”数据队列“)。DataStreamer会读取其中内容,并请求namenode返回一个datanode列表来存储当前的block副本。列表中的datanode会形成管线,DataStreamer将数据包发送给管线中的第一个datanode,第一个datanode将接收到的数据发送给第二个datanode,第二个发送给第三个… -
DFSOutputStream维护着一个数据包的队列,这个数据包需要写入到datanode中的,该队列成为
确认队列。当一个数据包在管线中所有的datanode写入完成,就从ack队列中移除该数据包。如果在数据写入期间datanode发生故障,则执行一下操作:a)
关闭管线,把确认队列中的所有包都添加回数据队列的最前端,以保证故障节点最下游的datanode不会漏掉任何一个数据包。
b) 为存储在另一正常 datanode 的当前数据块指定一个新的标志,并将该标志传给namenode,以便故障datanode在恢复后可以删除存储的部分数据块。
c) 从管线中删除故障数据节点并且把余下的数据块写入管线中另外两个正常的datanode。datanode在检测到副本数量不足时,会在另外一个节点上创建新的副本。
d) 后续的数据块继续正常接受处理。
e) 在一个块被写入期间可能会有多个datanode同时发生故障,但非常少见。只要设置了 dfs.replication.min的副本数(默认为1),写操作就会成功,并且这个块可以在集群中异步复制,直接达到其目标副本数(dfs.replication默认值是3)。 -
如果有多个block,则会反复从步骤4开始执行。
-
当客户端完成数据的传输,调用数据流的close方法。该方法将数据从队列中的剩余数据包写到datanode的管线并等待管线的确认。
-
客户端接收到管线中所有正常datanode的确认消息后,通知namenode数据写完了。
-
namenode已经知道文件由哪些块组成,所以它在返回成功前只需要等到数据块进行最小量的复制。
322

被折叠的 条评论
为什么被折叠?



