1. 程式人生 > >hadoop學習——namenode的fsimage與editlog詳解

hadoop學習——namenode的fsimage與editlog詳解

Namenode主要維護兩個檔案,一個是fsimage,一個是editlog。

fsimage儲存了最新的元資料檢查點,包含了整個HDFS檔案系統的所有目錄和檔案的資訊。對於檔案來說包括了資料塊描述資訊、修改時間、訪問時間等;對於目錄來說包括修改時間、訪問許可權控制資訊(目錄所屬使用者,所在組)等。

editlog主要是在NameNode已經啟動情況下對HDFS進行的各種更新操作進行記錄,HDFS客戶端執行所有的寫操作都會被記錄到editlog中。

簡單來想,NameNode維護了檔案與資料塊的對映表以及資料塊與資料節點的對映表,什麼意思呢?就是一個檔案,它切分成了幾個資料塊,以及這些資料塊分別儲存在哪些datanode上,namenode一清二楚。Fsimage就是在某一時刻,整個hdfs 的快照,就是這個時刻hdfs上所有的檔案塊和目錄,分別的狀態,位於哪些個datanode,各自的許可權,各自的副本個數。然後客戶端對hdfs所有的更新操作,比如說移動資料,或者刪除資料,都會記錄在editlog中。


為了避免editlog不斷增大,secondary namenode會週期性合併fsimage和edits成新的fsimage,新的操作記錄會寫入新的editlog中,這個週期可以自己設定(editlog到達一定大小或者定時)。


可以很清晰看出,第一步:將hdfs更新記錄寫入一個新的檔案——edits.new。

第二步:將fsimage和editlog通過http協議傳送至secondary namenode。

第三步:將fsimage與editlog合併,生成一個新的檔案——fsimage.ckpt。這步之所以要在secondary namenode中進行,是因為比較耗時,如果在namenode中進行,或導致整個系統卡頓。

第四步:將生成的fsimage.ckpt通過http協議傳送至namenode。

第五步:重新命名fsimage.ckpt為fsimage,edits.new為edits。

 

這樣的話,fsimage與editlog合併的過程就完成了。所以如果namenode宕機,其實secondary namenode還儲存這一份不久前的fsimage,還能挽回一些損失吧。

另外上篇中說,一旦有datanode掛掉了(宕機或者是網路阻塞),namenode能很快感知到,並且將宕機的節點上的資料塊轉移至其餘空閒節點。這點是因為hdfs中心跳機制(heartbeat)。

心跳機制預設3s中一次,datanode會向namenode傳送一次一跳,告知namenode當前節點上存放的資料檔案是什麼。如果namenode中記錄的是該datanode存放了檔案A的兩個資料塊和檔案B的一個數據塊,但是心跳中只有檔案A的一個數據塊資訊,namenode就會知道該datanode資料塊損壞了,會把損壞的資料塊在別的datanode上補充。

總之:

fsimage中儲存了namenode上邊的元資料的資訊,包括檔案的位置,檔案的大小,namenode與DataNode的對映關係,修改時間,訪問時間,訪問許可權等資訊。

editlog則是從namenode啟動之後,儲存對hdfs的各種操作,hdfs客戶端執行的寫操作等資訊都會儲存在editlog中。