HDFS中NameNode工作機制
引言
NameNode:
- 儲存元資料
- 管理整個HDFS叢集
DataNode:
儲存資料的block
SecondaryNameNode:
輔助HDFS完成一些事情
NameNode和SecondaryNameNode工作流程
編輯日誌檔案:edits
記載客戶端對HDFS的增刪改查的操作日誌
映象檔案:fsimage
記載元資料(HDFS上儲存的檔案目錄)及操作日誌
NameNode和SecondaryNameNode工作機制
工作流程詳解
-
第一階段:namenode啟動
-
第一次啟動namenode格式化後,建立fsimage和edits檔案。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
- 客戶端對元資料進行增刪改的請求。
- namenode記錄操作日誌,更新滾動日誌。
- namenode在記憶體中對資料進行增刪改查。
-
第一次啟動namenode格式化後,建立fsimage和edits檔案。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
-
第二階段:Secondary NameNode工作
- Secondary NameNode詢問namenode是否需要checkpoint。直接帶回namenode是否檢查結果。
- Secondary NameNode請求執行checkpoint。
- namenode滾動正在寫的edits日誌。
- 將滾動前的編輯日誌和映象檔案拷貝到Secondary NameNode。
-
Secondary NameNode載入編輯日誌和映象檔案到記憶體,併合並。
- 生成新的映象檔案fsimage.chkpoint。
- 拷貝fsimage.chkpoint到namenode。
- namenode將fsimage.chkpoint重新命名成fsimage。
chkpoint檢查的兩種觸發條件
- 通常情況下,SecondaryNameNode每隔一小時執行一次檢查點操作。
[hdfs-default.xml]
<!--兩次檢查點建立之間的固定時間間隔,預設3600,即1小時。所以去ann snn 看到的fsimage 相隔1個小時。--> <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> </property>
- 一分鐘檢查namenode的事務數量。若檢查事務數達到這個值1,000,000,也觸發一次SecondaryNameNode的checkpoint操作。
<!--hdfs-site.xml檔案設定--> <!--事務數量配置--> <property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <description>操作動作次數</description> </property> <!--檢查是否滿足數量的時間間隔週期--> <property> <name>dfs.namenode.checkpoint.check.period</name> <value>60</value> <description> 1分鐘檢查一次操作次數</description> </property> <!--在namenode上儲存的fsimage的數目,超出的會被刪除。預設儲存2個。--> <property> <name>dfs.namenode.num.checkpoints.retained</name> <value>2</value> </property>
映象檔案和編輯日誌檔案
namenode被格式化之後,將在/opt/app/hadoop/data/tmp/dfs/name/current目錄中產生如下檔案:
由於我的NameNode沒有格式化,只格式化了hadoop,並且將temp資料夾作為儲存日誌檔案的資料夾,所以以下檔案的訪問目錄均為:/opt/app/hadoop/temp/dfs/name/current
edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
- Fsimage檔案:HDFS檔案系統元資料的一個永久性的檢查點,其中包含HDFS檔案系統的所有目錄和檔案idnode的序列化資訊。
- Edits檔案:存放HDFS檔案系統的所有更新操作的路徑,檔案系統客戶端執行的所有寫操作首先會被記錄到edits檔案中。
- seentxid檔案:儲存的是一個數字,就是最後一個edits的數字
- 每次Namenode啟動的時候都會將fsimage檔案讀入記憶體,並從00001開始到seen_txid中記錄的數字依次執行每個edits裡面的更新操作,保證記憶體中的元資料資訊是最新的、同步的,可以看成Namenode啟動的時候就將fsimage和edits檔案進行了合併。
Notes:這些檔案被意外刪除後將無法恢復,需謹慎!
NameNode版本號
如上圖:在/opt/app/hadoop/data/tmp/dfs/name/current這個目錄下檢視VERSION
namenode版本號具體解釋:
- namespaceID:在HDFS上,會有多個Namenode,所以不同Namenode的namespaceID是不同的(主從架構:一個NameNode多個DataNode),分別管理一組blockpoolID。
- clusterID:叢集id,全域性唯一
- cTime:屬性標記了NameNode儲存系統的建立時間,對於剛剛格式化的儲存系統,這個屬性為0;但是在檔案系統升級之後,該值會更新到新的時間戳。
- storageType:屬性說明該儲存目錄包含的是NameNode的資料結構。
- blockpoolID:一個block pool id標識一個block pool,並且是跨叢集的全域性唯一。當一個新的Namespace被建立的時候(format過程的一部分)會建立並持久化一個唯一ID。在建立過程構建全域性唯一的BlockPoolID比人為的配置更可靠一些。NN將BlockPoolID持久化到磁碟中,在後續的啟動過程中,會再次load並使用。其針對每一個Namespace所對應blockpool的ID,該ID包括了其對應的NameNode節點的ip地址。
- layoutVersion:是一個負整數。通常只有HDFS增加新特性時才會更新這個版本號。
SecondaryNameNode詳解
SecondaryNameNode目錄結構
SecondaryNameNode用來監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS元資料的快照。
檢視路徑:/opt/app/hadoop/data/tmp/dfs/namesecondary/current
SecondaryNameNode的namesecondary/current目錄和主NameNode的current目錄的佈局相同。好處:在主namenode發生故障時(假設沒有及時備份資料),可以從SecondaryNameNode恢復資料。
NameNode恢復資料的方法
首先模擬NameNode損壞,即殺死NameNode程序:
kill -9 程序ID:強制將某程序殺死
方法一:將SecondaryNameNode中資料拷貝到namenode儲存資料的目錄;
方法二:使用-importCheckpoint選項啟動namenode守護程序,從而將SecondaryNameNode中資料拷貝到namenode目錄中。
-
案例實操(一):模擬namenode故障,並採用方法一,恢復namenode資料
-
kill -9 namenode程序/opt/app/hadoop/data/tmp/dfs/name)
rm -rf /opt/app/hadoop/data/tmp/dfs/name/*
拷貝SecondaryNameNode中資料到原namenode儲存資料目錄
cp -R /opt/app/hadoop/data/tmp/dfs/namesecondary/* /opt/app/hadoop/data/tmp/dfs/name/
重新啟動namenode:
sbin/hadoop-daemon.sh start namenode
-
kill -9 namenode程序/opt/app/hadoop/data/tmp/dfs/name)
-
案例實操(二):模擬namenode故障,並採用方法二,恢復namenode資料
-
修改hdfs-site.xml中的
<property> <name>dfs.namenode.checkpoint.period</name> <value>120</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/home/bigdata/hadoop-2.8.5/data/tmp/dfs/name</value> </property>
-
修改hdfs-site.xml中的
-
- kill -9 namenode程序
-
刪除namenode儲存的資料(/opt/app/hadoop/data/tmp/dfs/name)
rm -rf /opt/app/hadoop//data/tmp/dfs/name/*
-
如果SecondaryNameNode不和Namenode在一個主機節點上,需要將SecondaryNameNode儲存資料的目錄拷貝到Namenode儲存資料的平級目錄
[uek@node2 dfs]$ pwd
/opt/app/hadoop/data/tmp/dfs
[uek@node2 dfs]$ ls
data name namesecondary
-
匯入檢查點資料(等待一會ctrl+c結束掉)
bin/hdfs namenode -importCheckpoint
-
啟動namenode
sbin/hadoop-daemon.sh start namenode
-
如果提示檔案鎖了,可以刪除in_use.lock
rm -rf /opt/app/hadoop/data/tmp/dfs/namesecondary/in_use.lock