周海汉 2013.1.8
http://abloz.com/2013/01/08/hadoop-1-0-4-fsimage-file-format.html
fsimage文件存放在NameNode中,保存HDFS中文件的meta信息。fsimage和edits 文件格式是一样的。都是二进制存储。具有文件头,目录信息,文件信息。本文分析一下fsimage文件的格式。不同版本的fsimage文件格式会略有差异。
我的hdfs的一个目录和一个文件信息如下:
目录信息
drwxr-xr-x - zhouhh supergroup 0 2012-12-25 18:37 /hbase
文件信息
-rw-r–r– 2 zhouhh supergroup 1381 2012-09-26 14:03 /user/zhouhh/README.txt
fsimage文件描述:
一、首先是一个image head,其中包含:
1.imgVersion(int):当前image的版本信息
2.namespaceID(int):用来确保别的HDFS instance中的datanode不会误连上当前NN。
3.numFiles(long):整个文件系统中包含有多少文件和目录
4.genStamp(long):生成该image时的时间戳信息。
文件头的imgVersion,namespaceID在新版的fsImage中准备移除。
文件头,顺序格式
名称 | imgVersion (int) | namespaceID (int) | numFiles (long) | genstamp (long) |
值举例 | ffff ffe0 | 4e0a 6aed | 0000 0000 0000 0046 | 0000 0000 0000 044f (Thu Jan 01 08:00:01 CST 1970) |
二、目录
接下来便是目录和文件的元数据信息
而且紧跟文件头的是一个无名目录,即目录名称长度为0的根目录。
目录包含以下信息:
1.namelen(short):该目录的路径长度
2.Name(bytes): 该目录的路径,如”/user/zhouhh/data”
3.replications(short):副本数,目录为0
4.mtime(long):该目录的修改时间的时间戳信息
5.atime(long):该目录的访问时间的时间戳信息
6.blocksize(long):目录的blocksize都为0
7.numBlocks(int):实际有多少个文件块,目录的该值都为-1,即ffff ffff表示目录
8.nsQuota(long):namespace Quota值,若没加Quota限制则为-1
9.dsQuota(long):disk Quota值,若没加限制则也为-1
10.username(String):该目录的所属用户名,前面有个可变长度的长度描述,最长为int
11.group(String):该目录的所属组,前面有个可变长度的长度描述,最长为int
12.permission(short):该目录的权限信息,如644等,和POSIX权限保持一致。
目录,按顺序格式
名称 | nameLen (short) | name (bytes) | Replication (short) | ModificationTime (long) | access time (long) |
值举例 | 0006 | 2f 6862 6173 65(/hbase) | 0000 | 00 0001 3c0a df04 30 ("Sat Jan 05 21:20:53 CST 2013") | 0000 0000 0000 0000 |
名称 | preferred block size (long) | Blocks (int) | NsQuota (long) | DsQuota (long) |
值举例 | 0000 0000 0000 0000 | ffff ffff | ffff ffff ffff ffff | ffff ffff ffff ffff |
名称 | UsernameLen(var) | Username (bytes) | Groupname Len(var) | Groupname (bytes) | Permission (short) |
值举例 | 06 | 7a68 6f75 6868 (zhouhh) | 0a | 7375 7065 7267 726f 7570 (supergroup) | 01ed |
三、若从fsimage中读到的item是一个文件,则还会额外包含如下信息:
1.namelen(short):该文件的路径长度
2.Name(bytes): 该文件的路径,如”/user/zhouhh/README.txt”
3.replications(short):副本数,为dfs.replication配置数目,缺省为3
4.mtime(long):该文件的修改时间戳信息
5.atime(long):该文件的访问时间戳信息
6.blocksize(long):文件的blocksize,由dfs.block.size配置,缺省67108864,即0x4000000
7.numBlocks(int):实际有多少个文件块,文件的该值都>=1,-1表示目录
8.blockid(long):属于该文件的block的blockid,
9.numBytes(long):该block的大小
10.genStamp(long):该block的时间戳
11.username(String):该文件的所属用户名,前面有个可变长度的长度描述,最长为int
12.group(String):该文件的所属组,前面有个可变长度的长度描述,最长为int
13.permission(short):该文件的permission信息,如644等,和POSIX权限保持一致。
其中7,8,9三个部分是可以循环的,因为一个文件可以存在于多个block。文件没有配额信息。
文件,按顺序格式
我配的dfs.replication为2
名称 | nameLen (short) | name (bytes) | Replication (short) | ModificationTime (long) | access time (long) |
值举例 | 0017 | 2f75 7365 722f 7a68 6f75 6868 2f52 4541 444d 452e 7478 74 (/user/zhouhh/README.txt) | 0002 | 00 0001 3a01 2c3f 78 | 00 0001 3bcb aba6 ca |
名称 | preferred block size (long) | Blocklen (int) |
值举例 | 00 0000 0004 0000 00 | 0000 0001 |
Block 数据,循环 Blocklen次数
名称 | blockId(long) | numBytes(long) | generationStamp(long) |
值举例 | 00 0200 0001 3a01 2c | 00 0001 3a01 2c3f 78 | 00 0001 3bcb aba6 ca |
名称 | Usernamlen(var) | Username (bytes) | Groupnamelen(var) | Groupname (bytes) | Permission (short) |
值举例 | 06 | 7a68 6f75 6868 (zhouhh) | 0a | 7375 7065 7267 726f 7570 (supergroup) | 01 a4 |
一个fsimage 16进制文件的一部分:
0000000: ffff ffe0 4e0a 6aed 0000 0000 0000 0046 ....N.j........F
0000010: 0000 0000 0000 044f 0000 0000 0000 013c .......O.......<
0000020: 0adf 0430 0000 0000 0000 0000 0000 0000 ...0............
0000030: 0000 0000 ffff ffff 0000 0000 7fff ffff ................
0000040: ffff ffff ffff ffff 067a 686f 7568 680a .........zhouhh.
0000050: 7375 7065 7267 726f 7570 01ed 0005 2f64 supergroup..../d
0000060: 6174 6100 0000 0001 3c08 82c4 7e00 0000 ata.....
其中版本-32的值打印如下:
>>> vs=-32
>>> print "0x%08x"%(vs&0xffffffff)
0xffffffe0
public interface FSConstants {
public static int MAX_PATH_LENGTH = 8000;
public static final int LAYOUT_VERSION = -32;
}
如非注明转载, 均为原创. 本站遵循知识共享CC协议,转载请注明来源