名字節點(NameNode )是HDFS主從結構中主節點上運行的主要進程,它指導主從結構中的從節點,數據節點(DataNode)執行底層的I/O任務。
名字節點是HDFS的書記員,維護着整個文件系統的文件目錄樹,文件/目錄的元信息和文件的數據塊索引,即每個文件對應的數據塊列表(后面的討論中,上述關系也稱名字節點第一關系)。這些信息、以兩種形式存儲在本地文件系統中:一種是命名空間鏡像(File System Image, FSImage,也稱文件系統鏡像),另一種是命名空間鏡像的編輯日志(Edit Log) 。
命名空間鏡像保存着某一特定時刻HDFS的目錄樹、元信息和數據塊索引等信息,后續對這些信息的改動,則保存在編輯日志中,它們一起提供了一個完整的名字節點第一關系。
同時,通過名字節點,客戶端還可以了解到數據塊所在的數據節點信息。需要注意的是,名字節點中與數據節點相關的信息不保留在名字節點的本地文件系統中,也就是上面提到的命名空間鏡像和編輯日志中,名字節點每次啟動時,都會動態地重建這些信息,這些信息構成了名字節點第二關系。運行時,客戶端通過名宇節點獲取上述信息,然后和數據節點進行交互,讀寫文件數據。
另外,名字節點還能獲取HDFS整體運行狀態的一些信息,如系統的可用空間、己經使用的空間、各數據節點的當前狀態等。
第二名字節點(Secondary NameNode, SNN)是用於定期合並命名空間鏡像和鏡像編輯日志的輔助守護進程。和名字節點一樣,每個集群都有一個第二名字節點,在大規模部署的條件下,一般第二名字節點也獨自占用一台服務器。
第二名字節點和名字節點的區別在於:
它不接收或記錄HDFS的任何實時變化,而只是根據集群配置的時問間隔,不停地獲取HDFS某一個時間點的命名空間鏡像和鏡像的編輯日志,合並得到一個新的命名空間鏡像。該新鏡像會上傳到名字節點,替換原有的命名空間鏡像,並清空上述日志。應該說,第二名字節點配合名字節點,為名字節點上的名字節點第一關系提供了一個簡單的檢查點(Checkpoint)機制,並避免出現編輯日志過大,導致名字節點啟動時間過長的問題。
如前面所述,名字節點是 HDFS集群中的單一故障點,通過第二名字節點的檢查點,可以減少停機的時間並減低名字節點元數據丟失的風險。但是,第二名字節點不支持名字節點的故障白動恢復,名字節點失效處理需要人工干預。
沒有名稱節點,文件系統將無法使用。事實上,如果運行名稱節點的機器被毀壞了,文件系統上所有的文件都會丟失,因為我們無法知道如何通過數據節點上的塊來重建文件。因此,名稱節點能夠經受故障是非常重要的,Hadoop提供了兩種機制來確保這一點。
第一種機制就是復制那些組成文件系統元數據持久狀態的文件。Hadoop可以通過配置使名稱節點在多個文件系統上寫入其持久化狀態。這些寫操作是具同步性和原子性的。一般的配置選擇是,在本地磁盤上寫入的同時,寫入一個遠程NFS掛載(mount)。
另一種可行的方法是運行一個二級名稱節點,雖然它不能作為名稱節點使用。這個二級名稱節點的重要作用就是定期的通過編輯日志合並命名空間鏡像,以防止編輯日志過大。這個二級名稱節點一般在其他單獨的物理計算機上運行,因為它也需要占用大量CPU和內存來執行合並操作。它會保存合並后的命名空間鏡像的副本,在名稱節點失效后就可以使用。但是,二級名稱節點的狀態是比主節點滯后的,所以主節點的數據若全部丟失,損失仍在所難免。在這種情況下,一般把存在NFS上的主名稱節點元數據復制到二級名稱節點上並將其作為新的主名稱節點運行。
