HDFS—INode*

INode*.java 是用于描述目录、文件信息的类,如同我们之前讲到的我们提供给客户端透明的目录层次结构的访问方式,INode/INodeFile/INodeFileUnderConstruction/INodeDirectory/INodeDirectoryWithQuota 四个类,继承关系为:

INode

<<<==INodeFile<<<==INodeFileUnderConstruction(正在构建的文件)

<<<==INodeDirectory<<<==INodeDirectoryWithQuota(有容量限制的目录)

INode

INode-outline

实现接口Comparable<byte[]> 的一个抽象类。

变量name 名称,parent 父节点,modificationTime 修改时间,accessTime 访问时间。

静态类DirCounts 实现消耗名字空间消耗数量。

PermissionStatusFormat 类似于linux 中查看到六位数字表示的访问权限。在上文链接资料中蔡斌的博文也讲到了hdfs采用了类似于UNIX 中用户、组控制的安全策略

接着是INode 的构造函数INode( )。

接着是INode 关于权限的一些方法:设置权限信息,获取权限信息,取用户名等。

接着是一些get 状态、set 状态的一些方法。

INodeDirectory

INodeDirectory-outline

中定义了每个目录下默认文件数量,以及孩子节点的列表:

 1: protected static final int DEFAULT_FILES_PER_DIRECTORY = 5;
 2: final static String ROOT_NAME = "";
 3: private List<INode> children;

接着实现了INode 中的一些抽象类。

removeChild 和replaceChild 分别是移除和替换孩子节点,

getExistingPathINode 获取存在的路径INodes,输入是path,输出是已有的INode,是getExistingPathINodes 调用的函数。

INodeDirectorywithQuota

INodeDirectoryWithQuato-outline

新变量包含了名字空间和磁盘配额限制:

 1: private long nsQuota; /// NameSpace quota
 2: private long nsCount;
 3: private long dsQuota; /// disk space quota
 4: private long diskspace;

通过setSpaceConsumed 设置这个配额大小,

verifyQuota 用于验证这个配额限制(nsQuota<newCount & dsQuota<newDiskspace)

INodeFile

INodeFile-outline

首先是权限、表示块大小比特位数(48 bits)等信息,
接着是构造函数,get、set方法,其中
header 为long 型,前16位为副本个数,后48位为块大小所以在获取副本getReplication()函数中返回如下,HEADMASK 前16位为1,后48位为0的掩码。
 1: return (short) ((header & HEADERMASK) >> BLOCKBITS);

 

addBlock()添加一个块到块列表中,
getPenultimateBlock()获取倒数第二个块,
toINodeFileUnderConstruction()是将文件设置为受限制块

INodeFileUnderConstruction

INodeFileWithConstruction

INodeFileUnderConstruction 是指那些正在被写入的文件,因此受限(不可读写),下面是变量:

 1: String clientName;         // lease holder
 2: private final String clientMachine;
 3: private final DatanodeDescriptor clientNode; // if client is a cluster node too.
 4: private int primaryNodeIndex = -1; //the node working on lease recovery
 5: private DatanodeDescriptor[] targets = null;   //locations for last block
 6: private long lastRecoveryTime = 0;

clientName是客户名称,targets 是最后数据块位置,primaryNodeIndex 是指占据租约的节点。

convertToInodeFile() 该文件写完后设置为INodeFile 类型。

removeBlock() 从文件Block list中移除最后一个block。

setLastBlock() 设置最后一个块的内容,由于只能支持append 操作,因此只能修改最后一个块。

assignPrimaryDatanode() 选取了第一个活节点作为首选数据节点。

setLastRecoveryTime() 是在lastRecoveryTime 过期后设置lastRecoveryTime 为当前时间,lastRecoveryTime 是用来干嘛的?

关于INode 还可以参考这篇

PS:看到中间发现应该先去看Block类的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据