好程式設計師: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文件中。


分享到:


相關文章: