您的位置:首页 > Web前端 > Node.js

HDFS的文件操作流(5)——写操作(NameNode节点)

2011-11-16 21:30 281 查看
在前面的几篇博文中,我分别花了很大的篇幅来介绍HDFS在处理用户写一个文件时客户端、数据节点干了些什么事情,那么在本文,我将重点介绍一下NameNode节点在这个过程中到底为用户刚了些神马?

用户调用HDFS的API来写入一个文件,教科书式的标准三过程:1.create;2.write;3.close,对应于客户端的这三个工程,NameNode又相应的做了哪些响应呢?先来看一张图吧!



从上面的图中,我们可以清楚的看出NameNode对应于用户的三个动作分别以create、addBlock、complete来进行相关的处理。现在,我就来详细的分析NameNode的这三个动作是如何实现的。

NameNode的create动作主要是为客户端传过来的文件名在HDFS的Namesystem中申请一个名字空间,并为之建立一个响应的iNode,当然,这个iNode的状态是underConstruction,然后为这个客户创建一个该文件的租约,就是文件的独占锁,以防止其它的客户端对这个文件同时写。它的流程如下:



NameNode的addBlock动作主要是为文件创建一个新的Block,并为这个Block的副本分配存储DataNode节点,最后给客户端返回一个LocatedBlock对象,该对象包含Block的副本应该存放的位置。在这里我想说得是,NameNode节点此时并不保存该Block的副本位置,而是等到成功接收该Block的数据节点自动报告时它才正式记录该Block的一个副本的位置,这样做是由于HDFS不能保证Block一开始分配的数据节点都能成功结束Block。它的工作流程如下:



NameNode的complete动作就是更改与当前文件节点相关的状态,同时释放文件的租约。另外,NameNode还要判断文件的所有Blocks的副本是否已满足,对于还不满足的Blocks,NameNode将其放入neededReplications队列中,让其它的后台线程来负责这些Block的副本情况。它的工作流程如下:



关于NameNode处理客户端的写文件操作的处理流程细节都在上面的流程图中,但是,这个过程单中还有少量的与之没有直接关系的操作并没有在上面的流程图中反映出来,如果有兴趣的话,可以仔细研读相关的源代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: