我們知道HDFS是一個分布式文件存儲系統(tǒng),文件分布式存儲在多個DataNode節(jié)點上。一個文件存儲在哪些DataNode節(jié)點的哪些位置的元數(shù)據(jù)信息(metadata)由NameNode節(jié)點來處理。隨著存儲文件的增多,NameNode上存儲的信息也會越來越多。那么HDFS是如何及時更新這些metadata的呢?
在HDFS中主要是通過兩個組件FSImage和EditsLog來實現(xiàn)metadata的更新。在某次啟動HDFS時,會從FSImage文件中讀取當前HDFS文件的metadata,之后對HDFS的操作步驟都會記錄到edit log文件中。比如下面這個操作過程

那么完整的metadata信息就應(yīng)該由FSImage文件和edit log文件組成。fsimage中存儲的信息就相當于整個hdfs在某一時刻的一個快照。
FSImage文件和EditsLog文件可以通過ID來互相關(guān)聯(lián)。在參數(shù)dfs.namenode.name.dir設(shè)置的路徑下,會保存FSImage文件和EditsLog文件,如果是QJM方式HA的話,EditsLog文件保存在參數(shù)dfs.journalnode.edits.dir設(shè)置的路徑下。

在上圖中可以看到,edit log文件以edits_開頭,后面跟一個txid范圍段,并且多個edit log之間首尾相連,正在使用的edit log名字為edits_inprogress_txid。該路徑下還會保存兩個fsimage文件,文件格式為fsimage_txid。上圖中可以看出fsimage文件已經(jīng)加載到了最新的一個edit log文件,僅僅只有inprogress狀態(tài)的edit log未被加載。在啟動HDFS時,只需要讀入fsimage_0000000000000008927以及edits_inprogress_0000000000000008928就可以還原出當前hdfs的最新狀況。
但是這里又會出現(xiàn)一個問題,如果edit log文件越來越多、越來越大時,當重新啟動hdfs時,由于需要加載fsimage后再把所有的edit log也加載進來,就會出現(xiàn)第一段中出現(xiàn)的問題了。怎么解決?HDFS會采用checkpoing機制定期將edit log合并到fsimage中生成新的fsimage。這個過程就是接下來要講的了。