hadoop 1.0.4 fsimage 檔案格式分析
周海漢 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協議,轉載請註明來源