分布式文件系统HDFS名字节点(续)

来源:互联网 发布:苹果电脑mac怎么下游戏 编辑:程序博客网 时间:2024/06/07 02:30

接着上篇的数据块和数据节点管理,都在blockmanager包下面,FSNamesystem是在server.namenode包下面。知道为什么别的什么fs系列的都放在common工程的fs包下吗,因为FSNamesystem是特定HDFS文件系统的namenode中的内容,common放的是公共的东西,还有一些抽象出来的接口(此接口非彼接口)。

1. 几个类

第一关系中的INodeFile有BlockInfo,BlockInfo保存数据块的数据节点信息。数据节点信息由DatanodeDescription表示,但是我们发现在BlockInfo的构造方法中,除了super(),还创建了一个对象数组triplets,triplets的大小为3*副本个数,类型为DatanodeDescriptor。所以通过triplets可以找到数据块的位置(包括副本的位置),还可以找到前一个数据块,后一个数据块的位置包括他们的副本。这是通过链表来实现的。

和BlockInfo一样,DatanodeDescription添加了一些名字节点工作时需要的数据。这些数据分为三类:

(1)数据节点的状态

如数据节点的状态

(2)名字节点下发给数据节点的指令

如数据块的添加,删除,恢复,复制等命令

(3)BlockIterator

这是数据块迭代器,作用和早期版本的BlockInfo的变量相同,只不过,迭代器更近了一步

DatanodeDescription有如下的方法:

a.  当数据节点成功接收到一个数据块后,会通过远程方法blockRecieved报告名字节点。名字节点把它添加或更新到对应数据节点的DatanodeDescriptor对象中,使用的就是addBlock方法。但是它调用的不是BlockInfo.addNode(),BlockInfo也没有这个方法。他调用的是DatanodeStorageInfo的addBlock()方法,方法内部又将数据块插入到数据节点管理的数据块列表中。

b. 当namenode产生一条数据块复制命令时,他会在BlockQueue队列中获取最多maxTransfers个元素,然后返回BlockTargetPair类型的集合,即数据块与数据节点存储的对应关系。

2. 数据块副本状态

这个主要涉及FSNamesystem的成员FSDirectory,FSDirectory用于操作目录树,是个facade(也可叫service)。

对特定的数据块副本,FSNamesystem会有成员变量保存相应的数据块和执行操作时需要的附加信息,有些还有计数器来存放待删除数据块数目。

数据块复制有几个不同的状态,遵循特定的转换关系,分别为:复制中,等待复制,损坏,等待删除等状态。状态转换图就不画了。





0 0
原创粉丝点击