1. 程式人生 > >hadoop 1.0.4 fsimage 檔案格式分析

hadoop 1.0.4 fsimage 檔案格式分析

2013-01-08

周海漢 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協議,轉載請註明來源