FSNameSystem是HDFS文件系统实际执行的核心,提供各种增删改查文件操作接口。其内部维护多个数据结构之间的关系:
FSDirectory用于维护当前系统中的文件树。
其内部主要组成结构包括一个INodeDirectoryWithQuota作为根目录(rootDir)和一个FSImage来持久化文件树的修改操作。
HDFS中文件树用类似VFS中INode的方式构建,整个HDFS中文件被表示为INodeFile,目录被表示为INodeDirectory。INodeDiretoryWithQuota是INodeDirectory的扩展类,即带配额的文件目录
INodeFile表示INode书中的一个文件,扩展自INode,除了名字(name),父节点(parent)等之外,一个主要元素是blocks,一个BlockInfo数组,表示该文件对应的block信息。
BlocksMap用于维护Block -> { INode, datanodes, self ref } 的映射 BlocksMap结构比较简单,实际上就是一个Block到BlockInfo的映射。
Block是HDFS中的基本读写单元,主要包括:
BlockInfo扩展自Block,除基本信息外还包括一个inode引用,表示该block所属的文件;以及一个神奇的三元组数组Object[] triplets,用来表示保存该block的datanode信息,假设系统中的备份数量为3。那么这个数组结构如下:
DN2,DN3的prev-blk和next-blk类似。 HDFS采用这种结构存放block->datanode list的信息主要是为了节省内存空间,block->datanodelist之间的映射关系需要占用大量内存,如果同样还要将datanode->blockslist的信息保存在内存中,同样要占用大量内存。采用三元组这种方式能够从其中一个block获得到改block所属的datanode上的所有block列表。
FSImage用于持久化文件树的变更以及系统启动时加载持久化数据。 HDFS启动时通过FSImage来加载磁盘中原有的文件树,系统Standby之后,通过FSEditlog来保存在文件树上的修改,FSEditLog定期将保存的修改信息刷到FSImage中进行持久化存储。 FSImage中文件元信息的存储结构如下(参见FImage.saveFSImage()方法)
FSImage头之后是numberItemOfTree个INode信息,INode信息分为文件(INodeFile)和文件目录(INodeDirectory)两类,两者大体一致,分为INode头,Blocks区(目录没有blocks)和文件权限。
INode头
Blocks区
文件权限
layoutverion<-18版本的fsimage还包括正在构建的文件区。与普通Inode信息类似,均有inode头和blocks区以及文件权限,除此之外,underConstructionFile还包括:
client信息
已分配的datanode信息
CorruptReplicasMap通过一个TreeMap维护corrupt状态block的blocks-->datanodedescriptor(s)映射。一个block备份在多个datanode中,当其中的一个或多个datanode上的block损坏时,会将该datanode加到treeMap中该block对应的datanodeDescriptor集合中。FSNameSystem通过该Map来维护所有损坏的block与其对应datanode的关系。
维护最近失效的block集合,map中为storageId->ArrayList,当某个block的一个datanode上副本失效时会将改block和对应的datanode的storeageId添加到recentInvalidateSet中,当datanode想namenode进行heartbeat时,namenode会检查该datanode中是否有损坏的block,如有,则通知datanode删除改block。
datanodeMap用于维护datanode->block的映射
维护多有当前活着的节点
通过一个优先级队列来维护当前需要备份的block集合,副本数越少的block优先级越高,0为最高级,表示当前只有一个副本。
维护当前正在备份的block集合,并且进行备份请求的时间统计,并通过一个后台线程(PendingReplicationMonitor)来周期性(默认为5分钟)的统计超时的备份请求,当发生超时时,会将这个block重新添加到neededReplications列表中。
当前需要检查是否备份过多的block集合
维护系统中datanode与其上的超额备份block的集合,这些超额的备份将被删除。
转http://jiangbo.me/blog/2012/10/18/hdfs-namenode-datastructure/