昨天和舍友聊天時無心中提起Secondary NameNode,他說這是備用NameNode。我當時就有點疑惑。。以後查閱了相關資料和博客,算是基本理解了什麼是Secondary NameNode。工具
1. HDFS爲何要加入Secondary NameNode?
翻看《Hadoop權威指南》,書上明確寫道NameNode存在單點損壞問題,Hadoop爲了提升NameNode的容錯,提供瞭如下兩種機制:oop
- 備份組成文件系統元數據的文件
- 運行一個輔助NameNode
這裏提到的輔助NameNode也就是咱們要分析的Secondary NameNodespa
2. Secondary NameNode的真正做用
(1)首先,咱們先了解如下NameNode的相關概念:HDFS集羣中有兩種節點,DataNode(工做節點)和NameNode(管理結點),NameNode主要功能以下:日誌
- 管理文件系統的命名空間(NameSpace);
- 維護文件系統樹(FileSystem Tree)以及整棵樹內全部的文件和目錄(這些信息稱爲NameNode的MetaData)
- 記錄每一個文件中各個塊所在的數據結點信息(不永久保存,啓動時重建)
(2)NameNode的 MetaData 以兩種形式永久保存在本地磁盤上:內存
- 命名空間鏡像文件(fsimage):保存HDFS的最新狀態(截止到 fsimage 文件建立時的最新狀態)
- 編輯日誌文件(edits):自fsimage建立後NameSpace的操做日誌
(3)當NameNode 啓動時,須要合併fsimage和edits文件,按照edits文件內容將fsimage進行更行,從而獲得HDFS的最新狀態。實際應用中,NameNode不多從新啓動。假如存在一個龐大的集羣,且關於HDFS的操做至關頻繁與複雜,那麼就會產生一個很是大的edits文件用於記錄操做,這就帶來了如下問題:博客
- edits文件過大會帶來管理問題;
- 一旦須要重啓HDFS時,就須要花費很長一段時間對edits和fsimage進行合併,這就致使HDFS長時間內沒法啓動;
- 若是NameNode掛掉了,會丟失部分操做記錄(這部分記錄存儲在內存中,還未寫入edits);
(4)此時,Secondary NameNode(SN)就要發揮它的做用了:合併edits文件,防止edits文件持續增加。具體步驟以下:it
- SN向NameNode發送請求;
- NamoNode收到請求,暫停寫入edits;
- log記錄產生一個edits.new的文件;
- SN從NameNode獲取元數據,而後對edits和fsimage進行合併(將edits內容更新到fsimage),產生一個新的fsimage,將其發送給NameNode;
- NameNode收到後,將以前的fsimage文件進行覆蓋;
- NameNode刪除以前的edits文件,將edits.new重命名爲edits;
這樣就能夠避免edits文件的持續增加,也就解決上述幾個問題。io
3. Secondary NameNode什麼時候讀取元數據(checkpoint)
(1)達到最大時間間隔class
參數 fs.checkpoint.period:規定兩次checkpoint的最大時間間隔集羣
(2)edits文件的最大尺寸
參數 fs.checkpoint.size:當NameNode上的edits文件超過該尺寸,不管是否達到最大時間間隔,都強制執行checkpoint
4. CheckNode的誕生
因爲Secondary NameNode老是讓人「望文生義」,帶來理解上的誤差,Hadoop 1.0.4以後推薦再也不使用Secondary NameNod,而是其替代版CheckNode。兩者功能、配置徹底相同,只是執行命令有所不一樣
總結:
1. Secondary NameNode用於按期合併與編輯edits和fsimage文件,防止NameNode的edits文件增加過大;
2. Secondary nameNode通常運行在另外一臺物理機,由於其內存大小需求與NameNode一致;
3. Secondary NameNode更像是NameNode的輔助工具,而不是備用NameNode