Namenode
Namenode作为HDFS的主节点:
- 文件系统目录树的管理:HDFS第一关系链;
- 数据块以及数据节点管理:HDFS第二关系链;
- 租约管理;
- 缓存管理
一、文件系统目录树
HDFS的命名空间是以“/”为根的整个目录树,是通过FSDirectory来管理的;
不管是目录还是文件,在文件系统目录树中都被看作是一个INode节点;
目录:InodeDirectory;
文件:INodeFile。
HDFS会将命名空间存放在本地文件系统上的一个叫fsimage的文件中,利用这个文件,namenode每次重启都能将命名空间重构。
fsimage由FSImage类负责,同时,对HDFS的各种操作,都会在editlog中记录,以便周期性的合并生成fsimage。
1. INode相关类
1.1 INode类
INode是INodeDirectory和INodeFile的父类。同时实现了INodeAttributes接口:
INodeArrtibutes定义的get方法
userName:文件/目录所属用户名
groupName:文件/目录所属组名
fsPermission:文件/目录访问权限
aclFeature:安全相关
modificationTime:文件/目录上次修改时间
accessTime:上次访问时间
XAttrFeature:当前目录/文件的扩展属性
INode原信息的方法
id:INodede id;
name:文件/目录的名称
fullPathName:文件/目录的完整路径
parent:文件/目录的父节点
INode提供的基本判断方法:
isFile():判断是否为文件
isDirectory():判断是否为目录
isSymlink():判断是否为符号链接
isRoot():判断是否为文件系统目录树的根节点```
1.2 INodeWithAdditionalFields类
INode抽象类只定义了一个字段parent,其余字段的值都靠抽象的get()方法获得,并留给子类定义;
INodeWithAdditionalFields定义字段有:
id, name, permission, modificationTime, accessTime
1.3 INodeDirectory类
抽象了HDFS文件系统中的目录,里面保存了一组文件和其他一些目录。添加了成员变量Children
//使用一个Children字段保存该目录中所有孩子节点的INode对象
private List<INode> children = null
INodeDirectory的方法分为三类:
1.子目录相关的方法:children字段的增、删、改、查。
public boolean addChild(INode node){
//首先找到INode节点在children列表中的位置
final int low = searchChildren(node.getLocalNameBytes());
if(low >= 0){
return false;
}
//调用addChild()方法将INode节点插入到children列表的low位置
addChild(node, low);
return true;
}
public boolean removeChild(final INode child){
//找到INode节点在children列表中的位置
final int i = searchChildren(child.getLocalNameBytes());
if( i < 0){
return false;
}
//从children列表中删除
final INode removed = children.remove(i<