Namenode保存文件系統元數據鏡像,namenode在內存及磁盤(fsimage和editslog)上分別存在一份元數據鏡像文件,內存中元數據鏡像保證了hdfs文件系統文件訪問效率,磁盤上的元數據鏡像保證了hdfs文件系統的安全性。
namenode在磁盤上的兩類文件組成:
fsimage文件:保存文件系統至上次checkpoint為止目錄和文件元數據。
edits文件:保存文件系統從上次checkpoint起對hdfs的所有操作記錄日志信息。
fsimage和editlog文件可以在本地文件系統看到,如下圖:
首次安裝格式化(format)主要作用是在本地文件系統生成fsimage文件。
1、首此啟動hdfs過程:
啟動namenode:
讀取fsimage生成內存中元數據鏡像。
啟動datanode:
向namenode發送blockreport。
啟動成功后,client可以對HDFS進行目錄創建、文件上傳、下載、查看、重命名等操作,更改namespace的操作將被記錄在edits文件中。
2、之后啟動HDFS文件系統過程:
啟動namenode:
讀取fsimage元數據鏡像文件,加載到內存中。
讀取editlog日志文件,加載到內存中,使當前內存中元數據信息與上次關閉系統時保持一致。然后在磁盤上生成一份同內存中元數據鏡像相同的fsimage文件,同時生成一個新的null的editlog文件用於記錄以后的hdfs文件系統的更改。
啟動datanode:
向namenode注冊;
向namenode發送blockreport。
啟動成功后,client可以對HDFS進行目錄創建、文件上傳、下載、查看、重命名等操作,更改namespace的操作將被記錄在editlog文件中。
輔助namenode,不能代替namenode。
SecondaryNameNode的主要作用是用於合並fsimage和editlog文件。在沒有SecondaryNameNode守護進程的情況下,從namenode啟動開始至namenode關閉期間所有的HDFS更改操作都將記錄到editlog文件,這樣會造成巨大的editlog文件,所帶來的直接危害就是下次啟動namenode過程會非常漫長。
在啟動SecondaryNameNode守護進程后,每當滿足一定的觸發條件(每3600s、文件數量增加100w等),SecondaryNameNode都會拷貝namenode的fsimage和editlog文件到自己的目錄下,首先將fsimage加載到內存中,然后加載editlog文件到內存中合並fsimage和editlog文件為一個新的fsimage文件,然后將新的fsimage文件拷貝回namenode目錄下。並且聲稱新的editlog文件用於記錄DFS的更改。
4、安全模式
在啟動namenode至所有datanode啟動完成前的階段成為安全模式。在安全模式下,client只能讀取部分HDFS文件信息,不允許client對HDFS的任何更改操作,比如創建目錄、上傳文件、刪除文件、重命名文件等。
namenode推出安全模式條件需要滿足以下條件:
datanodes blocks/total blocks >= 99.999% + 30s(緩沖時間) 此時安全模式才會推出
1)secondary通知namenode切換edits文件
2)secondary通過http請求從namenode獲得fsimage和edits文件
3)secondary將fsimage載入內存,然后開始合並edits
4)secondary將新的fsimage發回給namenode
5)namenode用新的fsimage替換舊的fsimage
Secondary namenode工作流程通過一張圖可以表示為:
手工維護安全模式指令:
bin/hdfs dfsadmin -safemode <enter | leave | get | wait>
例如:
[hadoop@db01 ~]$ hdfs dfsadmin -safemode get
Safe mode is OFF