我們知道HDFS是一個分布式文件存儲系統(tǒng)急凰,文件分布式存儲在多個DataNode節(jié)點上。一個文件存儲在哪些DataNode節(jié)點的哪些位置的元數(shù)據(jù)信息(metadata)由NameNode節(jié)點來處理很钓。隨著存儲文件的增多香府,NameNode上存儲的信息也會越來越多。那么HDFS是如何及時更新這些metadata的呢码倦?
在HDFS中主要是通過兩個組件FSImage和EditsLog來實現(xiàn)metadata的更新企孩。在某次啟動HDFS時,會從FSImage文件中讀取當(dāng)前HDFS文件的metadata袁稽,之后對HDFS的操作步驟都會記錄到edit log文件中勿璃。比如下面這個操作過程
那么完整的metadata信息就應(yīng)該由FSImage文件和edit log文件組成。fsimage中存儲的信息就相當(dāng)于整個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就可以還原出當(dāng)前hdfs的最新狀況旧烧。
但是這里又會出現(xiàn)一個問題影钉,如果edit log文件越來越多、越來越大時掘剪,當(dāng)重新啟動hdfs時斧拍,由于需要加載fsimage后再把所有的edit log也加載進來,就會出現(xiàn)第一段中出現(xiàn)的問題了杖小。怎么解決?HDFS會采用checkpoing機制定期將edit log合并到fsimage中生成新的fsimage愚墓。這個過程就是接下來要講的了予权。