NameNode是HDFS中存儲元數據(文件名稱、大小和位置等信息)的地方,它將所有文件和文件夾的元數據保存在壹個文件系統目錄樹中,任何元數據信息的改變,NameNode都會記錄。HDFS中的每個文件都被拆分為多個數據塊存放,這種文件與數據塊的對應關系也存儲在文件系統目錄樹中,由NameNode維護。NameNode還存儲數據塊到DataNode的映射信息,這種映射信息包括:數據塊存放在哪些DataNode上、每個DataNode上保存了哪些數據塊。NameNode也會周期性地接收來自集群中DataNode的“心跳”和“塊報告”。通過“心跳”與DataNode保持通信,監控DataNode的狀態(活著還是宕機),若長時間接收不到“心跳”信息,NameNode會認為DataNode已經宕機,從而做出相應的調整策略。“塊報告”包含了DataNode上所有數據塊的列表信息。
DataNode是HDFS中真正存儲數據的地方。客戶端可以向DataNode請求寫入或讀取數據塊,DataNode還在來自NameNode的指令下執行塊的創建、刪除和復制,並且周期性地向NameNode匯報數據塊信息。
NodeSecondaryNameNode用於幫助NameNode管理元數據,從而使NameNode能夠快速、高效地工作。它並不是第二個NameNode,僅是NameNode的壹個輔助工具。HDFS的元數據信息主要存儲於兩個文件中:fsimage和edits。fsimage是文件系統映射文件,主要存儲文件元數據信息,其中包含文件系統所有目錄、文件信息以及數據塊的索引;edits是HDFS操作日誌文件,HDFS對文件系統的修改日誌會存儲到該文件中。當NameNode啟動時,會從文件fsimage中讀取HDFS的狀態,也會對文件fsimage和edits進行合並,得到完整的元數據信息,隨後會將新HDFS狀態寫入fsimage。但是在繁忙的集群中,edits文件會隨著時間的推移變得非常大,這就導致NameNode下壹次啟動的時間會非常長。為了解決這個問題,則產生了SecondaryNameNode,SecondaryNameNode會定期協助NameNode合並fsimage和edits文件,並使edits文件的大小保持在壹定的限制內。SecondaryNameNode通常與NameNode在不同的計算機上運行,因為它的內存需求與NameNode相同,這樣可以減輕NameNode所在計算機的壓力。