一、名稱節點(NameNode)
1.什么是名稱節點
在HDFS中,名稱節點負責管理分布式文件系統的命名空間(Namespace),保存了兩個核心的數據結構-FsImage和EditLog。
- FsImage:用於維護文件系統樹以及文件樹中所有的文件和文件夾的元數據。
- EditLog:中記錄所有針對文件創建、刪除、重命名等操作的日志文件。
名稱節點記錄了每個文件中各個塊所在的數據節點的位置信息,但並不持久化存儲這些信息,而是在系統每次啟動時掃描所有數據節點重構得到這些信息。
2.名稱節點工作過程

名稱節點啟動時,會將FsImage的內容加載到內存當中,然后執行EditLog文件中的各項操作,使得內存中的元數據保存最新。這個操作完成后,就會創建一個新的FsImage文件和一個空的EditLog文件。名稱節點啟動成功並進入正常運行狀態以后,HDFS中的更新操作都會被寫入到EditLog,而不是直接寫入FsImage(文件大,直接寫入系統會變慢)。
名稱節點在啟動的過程中處於“安全模式”,只能對外提供讀操作。啟動結束后,則進入正常運行狀態,對外提供讀寫操作。
二、第二名稱節點(Secondary NameNode)
1.功能
在名稱節點運行期間,EditLog文件由於操作不斷發生會逐漸變大,為解決逐漸變大帶來的問題,故采用了第二名稱節點。
- 可以完成EditLog與FsImage的合並操作,減少EditLog文件大小,縮短名稱節點重啟時間
- 作為名稱節點的“檢查點”,保存名稱節點中的元數據信息。
2.工作過程

- SecondaryNameNode會定期和NameNode通信,請求其停止使用EditLog文件,暫時將新的寫操作寫到一個新的文件edit.new上來,這個操作是瞬間完成,上層寫日志的函數完全感覺不到差別。
- SecondaryNameNode通過HTTP GET方式從NameNode上獲取到FsImage和EditLog文件,並下載到本地的相應目錄下。
- SecondaryNameNode將下載下來的FsImage載入到內存,然后一條一條地執行EditLog文件中的各項更新操作,使得內存中的FsImage保持最新;這個過程就是EditLog和FsImage文件合並。
- SecondaryNameNode執行完(3)操作之后,會通過post方式將新的FsImage文件發送到NameNode節點。
- NameNode將從SecondaryNameNode接收到的新的FsImage替換舊的FsImage文件,同時將edit.new替換EditLog文件,通過這個過程EditLog就變小了。
HDFS設計中,並不支持把系統直接切換到第二名稱節點,從這角度,第二名稱節點只是起到名稱節點“檢查點”的作用,並不能起到“熱備份”作用。即使有了第二名稱節點的存在,當名稱節點發生故障時,系統還是有可能會丟失部分元數據信息。
Reference:
dblab.xmu.edu.cn
學習交流,有任何問題還請隨時評論指出交流。