在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文件中。
閱讀更多 好程序員 的文章