NN和2NN工作機制詳解:
Fsimage:NameNode內存中元數據序列化後形成的文件。
Edits:記錄客戶端更新元數據信息的每一步操作(可通過Edits運算出元數據)。
NameNode啓動時,先滾動Edits並生成一個空的edits.inprogress,然後加載Edits和Fsimage到內存中,此時NameNode內存就持有最新的元數據信息。Client開始對NameNode發送元數據的增刪改的請求,這些請求的操作首先會被記錄到edits.inprogress中(查詢元數據的操作不會被記錄在Edits中,因爲查詢操作不會更改元數據信息),如果此時NameNode掛掉,重啓後會從Edits中讀取元數據的信息。然後,NameNode會在內存中執行元數據的增刪改的操作。
由於Edits中記錄的操作會越來越多,Edits文件會越來越大,導致NameNode在啓動加載Edits時會很慢,所以需要對Edits和Fsimage進行合併(所謂合併,就是將Edits和Fsimage加載到內存中,照着Edits中的操作一步步執行,最終形成新的Fsimage)。SecondaryNameNode的作用就是幫助NameNode進行Edits和Fsimage的合併工作。
SecondaryNameNode首先會詢問NameNode是否需要CheckPoint(觸發CheckPoint需要滿足兩個條件中的任意一個,定時時間到和Edits中數據寫滿了)。直接帶回NameNode是否檢查結果。SecondaryNameNode執行CheckPoint操作,首先會讓NameNode滾動Edits並生成一個空的edits.inprogress,滾動Edits的目的是給Edits打個標記,以後所有新的操作都寫入edits.inprogress,其他未合併的Edits和Fsimage會拷貝到SecondaryNameNode的本地,然後將拷貝的Edits和Fsimage加載到內存中進行合併,生成fsimage.chkpoint,然後將fsimage.chkpoint拷貝給NameNode,重命名爲Fsimage後替換掉原來的Fsimage。NameNode在啓動時就只需要加載之前未合併的Edits和Fsimage即可,因爲合併過的Edits中的元數據信息已經被記錄在Fsimage中。
Fsimage和Edits解析
oiv查看Fsimage文件
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
cat /opt/module/hadoop-2.7.2/fsimage.xml
oev查看Edits文件
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
cat /opt/module/hadoop-2.7.2/edits.xml
CheckPoint
- 通常情況下,SecondaryNameNode每隔一小時執行一次。
[hdfs-default.xml]
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
- 一分鐘檢查一次操作次數,3當操作次數達到1百萬時,SecondaryNameNode執行一次。
<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故障處理
NameNode故障後,可以採用如下兩種方法恢復數據。
方法一:將SecondaryNameNode中數據拷貝到NameNode存儲數據的目錄;
- kill -9 NameNode進程
- 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
- 拷貝SecondaryNameNode中數據到原NameNode存儲數據目錄
scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
- 重新啓動NameNode
sbin/hadoop-daemon.sh start namenode
方法二:使用-importCheckpoint選項啓動NameNode守護進程,從而將SecondaryNameNode中數據拷貝到NameNode目錄中。
- 修改hdfs-site.xml中的
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value>
</property>
- kill -9 NameNode進程
- 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
- 如果SecondaryNameNode不和NameNode在一個主機節點上,需要將SecondaryNameNode存儲數據的目錄拷貝到NameNode存儲數據的平級目錄,並刪除in_use.lock文件
scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./
rm -rf in_use.lock
pwd
/opt/module/hadoop-2.7.2/data/tmp/dfs
ls
data name namesecondary
- 導入檢查點數據(等待一會ctrl+c結束掉)
bin/hdfs namenode -importCheckpoint
- 啓動NameNode
sbin/hadoop-daemon.sh start namenode
集羣安全模式
命令
bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式狀態)
bin/hdfs dfsadmin -safemode enter (功能描述:進入安全模式狀態)
bin/hdfs dfsadmin -safemode leave (功能描述:離開安全模式狀態)
bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式狀態)