好程序员:Namenode元数据管理

在namenode运行时会将内存中的元数据信息存储到所指定的文件,即${dfs.name.dir}/current目录下的fsimage文件,此外还会将另外一部分对namenode更改的日志信息存储到${dfs.name.dir}/current目录下的edits文件中。fsimage文件和edits文件可以确定namenode节点当前的状态,这样在namenode节点由于突发原因崩溃时,可以根据这两个文件中的内容恢复到节点崩溃前的状态,所以对namenode节点中内存元数据的每次修改都必须保存下来。但是如果每次都保存到fsimage文件中,这样效率就特别低,所以引入编辑日志文件edits,保存对元数据的修改信息,也就是fsimage文件保存namenode节点中某一时刻内存中的元数据(即目录树),edits保存这一时刻之后的对元数据的更改信息。
一、内存元数据
内存中有一份完整的元数据(内存meta data),包含文件路径、副本数、blockid,及每一个block所在datanode的信息。
二、fsimage镜像文件
fsimage 文件其实是 hadoop 文件系统元数据的一个永久性的检查点,其中包含 hadoop 文件系统中的所有目录和文件 idnode 的序列化信息;
使用命令将二进制fsimage文件还原成xml文件hdfs fs -oiv -i fsimage“文件输入路径” -p xml -o “输出路径”
1.首先是一个image head,其中包含:
imgversion(int):当前image的版本信息
namespaceid(int):用来确保别的hdfs instance中的datanode不会误连上当前nn。
numfiles(long):整个文件系统中包含有多少文件和目录
genstamp(long):生成该image时的时间戳信息。
2.接下来便是对每个文件或目录的源数据信息,如果是目录,则包含以下信息:
path(string):该目录的路径,如“/user/build/build-index”
replications(short):副本数(目录虽然没有副本,但这里记录的目录副本数也为3)
mtime(long):该目录的修改时间的时间戳信息
atime(long):该目录的访问时间的时间戳信息
blocksize(long):目录的blocksize都为0
numblocks(int):实际有多少个文件块,目录的该值都为-1,表示该item为目录
nsquota(long):namespace quota值,若没加quota限制则为-1
dsquota(long):disk quota值,若没加限制则也为-1
username(string):该目录的所属用户名
group(string):该目录的所属组
permission(short):该目录的permission信息,如644等,有一个short来记录。
3.若从fsimage中读到的是一个文件,则还会额外包含如下信息:
blockid(long):属于该文件的block的blockid
numbytes(long):该block的大小
genstamp(long):该block的时间戳
三、edits日志文件
edits存放的是 hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 edits文件中。