NameNode和SecondaryNameNode工作機制

奈學教育發表於2020-07-28
1.NameNode啟動
(1)首次啟動需要格式化NameNode,建立Fsimage和Edits檔案。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
(2)客戶端對後設資料進行增刪改的請求。
(3)NameNode記錄操作日誌,更新滾動日誌。
(4)NameNode在記憶體中對後設資料進行增刪改。
2.SecondaryNameNode工作
(1)SecondaryNameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否檢查結果。
(2)SecondaryNameNode請求執行CheckPoint。
(3)NameNode滾動正在寫的Edits日誌。
(4)將滾動前的編輯日誌和映象檔案複製到SecondaryNameNode。
(5)Secondary NameNode載入編輯日誌和映象檔案到記憶體,併合並。
(6)生成新的映象檔案fsimage.chkpoint。
(7)複製fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
      名詞解釋:
      Fsimage:NameNode記憶體中後設資料序列化後形成的檔案。
      Edits:記錄客戶端更新後設資料資訊的每一步操作(可透過Edits運算出後設資料)。
3.詳細工作機制
      NameNode啟動時,先滾動Edits並生成一個空的edits.inprogress,然後載入Edits和Fsimage到記憶體中,此時NameNode記憶體就持有最新的後設資料資訊。Client開始對NameNode傳送後設資料的增刪改的請求,這些請求的操作首先會被記錄到edits.inprogress中(查詢後設資料的操作不會被記錄在Edits中,因為查詢操作不會更改後設資料資訊),如果此時NameNode掛掉,重啟後會從Edits中讀取後設資料的資訊。然後,NameNode會在記憶體中執行後設資料的增刪改的操作。
      由於Edits中記錄的操作會越來越多,Edits檔案會越來越大,導致NameNode在啟動載入Edits時會很慢,所以需要對Edits和Fsimage進行合併(所謂合併,就是將Edits和Fsimage載入到記憶體中,照著Edits中的操作一步步執行,最終形成新的Fsimage)。SecondaryNameNode的作用就是幫助NameNode進行Edits和Fsimage的合併工作。
      SecondaryNameNode首先會詢問NameNode是否需要CheckPoint(觸發CheckPoint需要滿足兩個條件中的任意一個,定時時間到和Edits中資料寫滿了)。直接帶回NameNode是否檢查結果。SecondaryNameNode執行CheckPoint操作,首先會讓NameNode滾動Edits並生成一個空的edits.inprogress,滾動Edits的目的是給Edits打個標記,以後所有新的操作都寫入edits.inprogress,其他未合併的Edits和Fsimage會複製到SecondaryNameNode的本地,然後將複製的Edits和Fsimage載入到記憶體中進行合併,生成fsimage.chkpoint,然後將fsimage.chkpoint複製給NameNode,重新命名為Fsimage後替換掉原來的Fsimage。NameNode在啟動時就只需要載入之前未合併的Edits和Fsimage即可,因為合併過的Edits中的後設資料資訊已經被記錄在Fsimage中。
本文來源於:奈學開發者社群 ,如有侵權請聯絡我刪除


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2707595/,如需轉載,請註明出處,否則將追究法律責任。

相關文章