1. 程式人生 > >Secondary NameNode

Secondary NameNode

元數據 地址 系統 文件系統 幫助 兩個文件 數控 更新 fsimage

  在Hadoop中,有一些命名不好的模塊,Secondary NameNode是其中之一。從它的名字上看,它給人的感覺就像是NameNode的備份。但它實際上卻不是。HDFS集群有兩類節點以管理者和工作者的工作模式運行,namenode就是其中的管理者。它管理著文件系統的命名空間,維護著文件系統樹及整棵樹的所有文件和目錄。這些信息以兩個文件的形式保存於內存或者磁盤,這兩個文件是:命名空間鏡像文件fsimage和編輯日誌文件edit logs ,同時namenode也記錄著每個文件中各個塊所在的數據節點信息。

  技術分享圖片

圖中有兩個文件:
(1)fsimage:文件系統映射文件,也是元數據的鏡像文件(磁盤中),存儲某段時間namenode內存元數據信息。
(2)edits log:操作日誌文件。
這種工作方式的特點:
(1)namenode始終在內存中存儲元數據(metedata),使得“讀操作”更加快、
(2)有“寫請求”時,向edits文件寫入日誌,成功返回後才修改內存,並向客戶端返回。
(3)fsimage文件為metedata的鏡像,不會隨時同步,與edits合並生成新的fsimage。

從以上特點可以知道,edits文件會在集群運行的過程中不斷增多,占用更多的存儲空間,雖然有合並,但是只有在namenode重啟時才會進行。並且在實際工作環境很少重啟namenode,
這就帶來了一下問題:
(1)edits文件不斷增大,如何存儲和管理?
(2)因為需要合並大量的edits文件生成fsimage,導致namenode重啟時間過長。
(3)一旦namenode宕機,用於恢復的fsiamge數據很舊,會造成大量數據的丟失。

Secondary NameNode
上述問題的解決方案就是運行輔助namenode–Secondary NameNode,為主namenode內存中的文件系統元數據創建檢查點,Secondary NameNode所做的不過是在文件系統中設置一個檢查點來幫助NameNode更好的工作。它不是要取代掉NameNode也不是NameNode的備份,
SecondaryNameNode有兩個作用,一是鏡像備份,二是日誌與鏡像的定期合並。兩個過程同時進行,稱為checkpoint(檢查點)。
鏡像備份的作用:備份fsimage(fsimage是元數據發送檢查點時寫入文件);
日誌與鏡像的定期合並的作用:將Namenode中edits日誌和fsimage合並,防止如果Namenode節點故障,namenode下次啟動的時候,會把fsimage加載到內存中,應用edits log,edits log往往很大,導致操作往往很耗時。(這也是namenode容錯的一套機制)

技術分享圖片

Secondarynamenode工作過程
(1)SecondaryNameNode通知NameNode準備提交edits文件,此時主節點將新的寫操作數據記錄到一個新的文件edits.new中。
(2)SecondaryNameNode通過HTTP GET方式獲取NameNode的fsimage與edits文件(在SecondaryNameNode的current同級目錄下可見到 temp.check-point或者previous-checkpoint目錄,這些目錄中存儲著從namenode拷貝來的鏡像文件)。
(3)SecondaryNameNode開始合並獲取的上述兩個文件,產生一個新的fsimage文件fsimage.ckpt。
(4)SecondaryNameNode用HTTP POST方式發送fsimage.ckpt至NameNode。
(5)NameNode將fsimage.ckpt與edits.new文件分別重命名為fsimage與edits,然後更新fstime,整個checkpoint過程到此結束。
SecondaryNameNode備份由三個參數控制fs.checkpoint.period控制周期(以秒為單位,默認3600秒),fs.checkpoint.size控制日誌文件超過多少大小時合並(以字節為單位,默認64M), dfs.http.address表示http地址,這個參數在SecondaryNameNode為單獨節點時需要設置。

從工作過程可以看出,SecondaryNameNode的重要作用是定期通過編輯日誌文件合並命名空間鏡像,以防止編輯日誌文件過大。SecondaryNameNode一般要在另一臺機器上運行,因為它需要占用大量的CPU時間與namenode相同容量的內存才可以進行合並操作。它會保存合並後的命名空間鏡像的副本,並在namenode發生故障時啟用。

Secondary NameNode