Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15785
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-08 14:16
文章分类
文章存档

2015年(9)

我的朋友

分类: HADOOP

2015-05-12 17:16:43


我们先分析INode*.java,类INode*抽象了文件层次结构。如果我们对文件系统进行面向对象的抽象,一定会得到和下面一样
类似的结构图(类INode*):
 

INode 是一个抽象类,它的两个字类,分别对应着目录(INodeDirectory)和文件(INodeFile)。INodeDirectoryWithQuota,
如它的名字隐含的,是带了容量限制的目录。INodeFileUnderConstruction,抽象了正在构造的文件,当我们需要在HDFS 中创
建文件的时候,由于创建过程比较长,目录系统会维护对应的信息。
INode 中的成员变量有:name,目录/文件名;modificationTime 和accessTime 是最后的修改时间和访问时间;parent 指向了
父目录;permission 是访问权限。HDFS 采用了和UNIX/Linux 类似的访问控制机制。系统维护了一个类似于UNIX 系统的组表
(group)和用户表(user),并给每一个组和用户一个ID,permission 在INode 中是long 型,它同时包含了组和用户信息。
INode 中存在大量的get 和set 方法,当然是对上面提到的属性的操作。导出属性,比较重要的有:
collectSubtreeBlocksAndClear,用于收集这个INode 所有后继中的Block;computeContentSummary 用于递归计算INode 包含
的一些相关信息,如文件数,目录数,占用磁盘空间。
INodeDirectory 是HDFS 管理的目录的抽象,它最重要的成员变量是:
privatprivate List children;
就是这个目录下的所有目录/文件集合。INodeDirectory 也是有大量的get 和set 方法,都很简单。INodeDirectoryWithQuota
进一步加强了INodeDirectory,限制了INodeDirectory 可以使用的空间(包括NameSpace 和磁盘空间)。
INodeFile 是HDFS 中的文件,最重要的成员变量是:
protected BlockInfo blocks[] = null;
这是这个文件对应的Block 列表,BlockInfo 增强了Block 类。
INodeFileUnderConstruction 保存了正在构造的文件的一些信息,包括clientName,这是目前拥有租约的节点名(创建文件时,
只有一个节点拥有租约,其他节点配合这个节点工作)。clientMachine 是构造该文件的客户端名称,如果构造请求由DataNode
发起,clientNode 会保持相应的信息,targets 保存了配合构造文件的所有节点。
上面描述了INode*类的关系。下面我们顺便考察一下一些NameNode 上的数据类。
BlocksMap 保存了Block 和它在NameNode 上一些相关的信息。其核心是一个map:Map。BlockInfo 扩展了
Block,保存了该Block 归属的INodeFile 和DatanodeDescriptor,同时还包括了它的前继和后继Block。有了BlocksMap,就
可以通过Block 找对应的文件和这个Block 存放的DataNode 的相关信息。
接下来我们来分析类Datanode*。DatanodeInfo 和DatanodeID 都定义在包org.apache.hadoop.hdfs.protocol。
DatanodeDescriptor 是DatanodeInfo 的子类,包含了NameNode 需要的附加信息。DatanodeID 只包含了一些配置信息,
DatanodeInfo 增加了一些动态信息,DatanodeDescriptor 更进一步,包含了DataNode 上一些Block 的动态信息。
DatanodeDescriptor 包含了内部类BlockTargetPair,它保存Block 和对应DatanodeDescriptor 的关联,BlockQueue 是
BlockTargetPair 队列。
DatanodeDescriptor 包含了两个BlockQueue,分别记录了该DataNode 上正在复制(replicateBlocks)和Lease 恢复
(recoverBlocks)的Block。同时还有一个Block 集合,保存的是该DataNode 上已经失效的Block。DatanodeDescriptor 提
供一系列方法,用于操作上面保存的队列和集合。也提供get*Command 方法,用于生成发送到DataNode 的命令。
当NameNode 收到DataNode 对现在管理的Block 状态的汇报是,会调用reportDiff,找出和现在NameNode 上的信息差别,以
供后续处理用。
readFieldsFromFSEditLog 方法用于从日志中恢复DatanodeDescriptor。
更多内容请关注:
关注超人学院微信:BJ-CRXY
阅读(692) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~