Hadoop HDFS源码namenode部分概述(一)(2)

一个一个介绍。

FSdirectory:

FSDirectory存储整个文件系统的目录状态,对整个目录结构的管理通过调用FSImage和FSEditLog的方法从namenode本地磁盘读取元数据信息和向本地磁盘写入元数据信息,并登记对目录结构所作的修改到日志文件。另外,FSDirectory保存了文件名和数据块的映射关系。

INode是对文件系统目录结构中一个节点的抽象

INodeFile和INodeDirectory均继承自INode类,分别表示文件节点和目录节点。

INodeFile类中最重要的数据结构是BlockInfo blocks[],它记录了一个文件所包含的所有Block,成员方法的操作大都与Block相关

INodefileUnderConstruction表示正在都建的文件

INodeDirectory的关键数据结构是List<INode> children记录了目录下所有的子节点信息

INodeDirectoryWithQuota表示有配额限制的目录,根目录就是这种类型。

FSimage:

把文件和目录的元数据信息持久化地存储到fsimage文件中,每次启动时从中将元数据加载到内存中构建目录结构树,之后的操作记录在edits log中

定期将edits与fsimage合并刷到fsimage中

loadFSImage(File curFile)用于从fsimage中读入Namenode持久化的信息。fsimage中保存的元数据信息格式如下,hdfs加载和写入时都按照该格式进行

fsimage是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息,格式如下,这是网上流传的一张经典图,这是淘宝的一个师兄画的,拿来站沾光。

imageVersion(int)——image版本号

namespaceID(int)——命名空间ID,在namenode的生命期内保持不变,datanode注册时

返回作为其registrationID,每次和namenode通信时都要检查,不认识的namespaceID拒绝连接.

numFiles(16版以后long型)记录文件系统中的文件数

genstamp(long)生成image时间戳

下面是numFiles个文件(目录)信息:

path(String)文件或目录路径

replication(int)副本数,会调用FSEditLog.adjustReplication(replication);调整,目录的为0

mtime(long)修改时间

atime(long)访问时间

blockSize(long)块大小,目录是0

NumBlocks(int)文件包含的块数(imageVersion 9以后的版本numBlocks>=0时表示文件,之前的版本>0时表示文件),目录的为-1,saveINode2Image方法中可以看到

如果是文件,下面是NumBlocks个block的相关信息:

blockId(long):该文件的block的blockid,

numBytes(long):该block的大小

generationStamp(long):该block的时间戳

如果是目录,读入quota信息:

nsQuota(long)命名空间大小配额,默认-1

dsQuota(long)磁盘空间配额,默认-1

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5b9421da4678efcb062d6a03e8a77d4a.html