HDFS - 什麼是元數據咱們提到了CheckPoint機制,主要就是合併多個edits文件,NameNode的壓力已經很大了,因此合併的事情,並非NameNode來作的,而是SecondaryNamenode來支持的,若是在高可用集羣或者聯邦集羣,那合併的事情,就是有standby節點的NameNode來作的。node
HDFS - 什麼是元數據中提到了磁盤中的元數據包括fsimage、edits_inprogress、edits、seen_txid、VERSION這些文件。
剛開始的時候,是沒有edits文件的。
當NameNode運行一段時間後,就開始慢慢的生成多個edits文件,文件名格式是edits_數字-數字(數字是19位的,我這裏畫圖寫了4位),而且是遞增的。
前面的文章說過,NameNode重啓的時候,就會加載edits_inprogress、edits、以及fsimage這幾個文件,由於這幾個文件合起來就是完整的元數據。因爲edits會愈來愈多,因此就須要進行合併,提升啓動的速度,可是NameNode的壓力已經很大了,因此須要SecondaryNamenode來作。
SecondaryNamenode會隔一段時間就去請求NameNode獲取fsimage和edits文件,若是兩次CheckPoint的時間已經超過1個小時或者兩次CheckPoint的操做記錄已經超過10w條,那NameNode就會生成一個空的edits.new文件,同時把edits文件以及fsimage文件發送給SecondaryNamenode。
SecondaryNamenode就會在本地把edits文件和fsimage文件進行合併,生成一個新的fsimage.ckpt文件。
生成後的fsimage.ckpt就會發給NameNode,NameNode就會把這個文件覆蓋原來的fsimage,fsimage_0006此時後面的數字,對應着edits_0001到edits_0006的元數據集合。此時就會把舊的edits刪除,而且把edits.new文件重命名edis文件。
有時候咱們會看到fsimage會有兩個,這個是爲了最新fsimage不可用的時候,能回滾以前的元數據狀態,固然新增的元數據就丟失了。
segmentfault
若是非集羣的話,元數據的持久化是寫入磁盤,若是是集羣的話,元數據除了寫入磁盤,還會寫入JournalNode。因此剛開始的時候,active節點的NameNode和JournalNode的元數據是同樣的。
standby節點的NameNode,每隔60秒,就會去JournalNode讀取元數據信息。
當CheckPoint觸發的時候,就會把edits文件和fsimage文件,合併生成新的fsimage文件。
而後standby節點的NameNode就會把新的fsimage發送給active節點的NameNode。active節點的NameNode替換舊的fsimage,就會把edits文件刪除。
至此,完成了edits文件和fsimage的合併。spa