一、存儲機制
1、基礎(chǔ)描述
NameNode運行時元數(shù)據(jù)需要存放在內(nèi)存中,同時在磁盤中備份元數(shù)據(jù)的fsImage,當元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時,修改內(nèi)存中的元數(shù)據(jù)會把操作記錄追加到edits日志文件中,這里不包括查詢操作。如果NameNode節(jié)點發(fā)生故障,可以通過FsImage和Edits的合并,重新把元數(shù)據(jù)加載到內(nèi)存中,此時SecondaryNameNode專門用于fsImage和edits的合并。
2、工作流程

NameNode機制
- NameNode格式化啟動之后,首次會創(chuàng)建Fsimage和Edits文件;
- 非首次啟動直接加載FsImage鏡像文件和Edits日志到內(nèi)存中;
- 客戶端對元數(shù)據(jù)執(zhí)行增刪改操作會記錄到Edits文件;
- 然后請求的相關(guān)操作會修改內(nèi)存中的元數(shù)據(jù);
SecondaryNameNode機制
- 詢問NameNode是否需要CheckPoint,NameNode返回信息;
- 如果需要SecondaryNameNode請求執(zhí)行CheckPoint;
- NameNode切割現(xiàn)有日志文件,新記錄滾動寫入新Edits文件;
- 滾動前的編輯日志和鏡像文件拷貝到SecondaryNameNode;
- SecondaryNameNode加載Edits日志和FsImage鏡像文件到內(nèi)存合并;
- 生成新的鏡像文件fsimage.chkpoint后拷貝到NameNode;
- NameNode將fsimage.chkpoint重新命名成fsimage;
3、CheckPoint設(shè)置
通過修改hdfs-default.xml文件的相關(guān)配置,設(shè)置一些SecondaryNameNode的機制,例如每隔一小時執(zhí)行一次。
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<property>
<name>dfs.namenode.checkpoint.txns</name>
<value>1000000</value>
<description>文件滿1000000記錄數(shù)</description>
</property>
<property>
<name>dfs.namenode.checkpoint.check.period</name>
<value>60</value>
<description> 1分鐘檢查一次文件記錄數(shù)</description>
</property >
二、文件信息
1、FsImage文件
NameNode內(nèi)存中元數(shù)據(jù)序列化備份信息;
生成路徑:基于NameNode節(jié)點
cd /opt/hadoop2.7/data/tmp/dfs/name/current/

查看文件
# 基本語法
hdfs oiv -p 轉(zhuǎn)換文件類型 -i 鏡像文件 -o 轉(zhuǎn)換后文件輸出路徑
基于語法格式,操作上圖中的文件:
# 轉(zhuǎn)換文件
hdfs oiv -p XML -i fsimage_0000000000000000019 -o /data/fsimage.xml
# 查看
cat /data/fsimage.xml
這樣就可以看到一些元數(shù)據(jù)的信息。
2、Edits文件
存放HDFS文件的所有增刪改操作的路徑,會記錄在Edits文件中。
基本語法
hdfs oev -p 轉(zhuǎn)換文件類型 -i 日志文件 -o 轉(zhuǎn)換后文件輸出路徑
查看文件
# 轉(zhuǎn)換文件
hdfs oev -p XML -i edits_0000000000000000020-0000000000000000020 -o /data/edits.xml
# 查看
cat /data/edits.xml
三、故障恢復(fù)
1、拷貝SecondaryNameNode數(shù)據(jù)
首先結(jié)束NameNode進程;
刪除NameNode存儲的數(shù)據(jù);
[root@hop01 /] rm -rf /opt/hadoop2.7/data/tmp/dfs/name/*
拷貝SecondaryNameNode中數(shù)據(jù)到NameNode數(shù)據(jù)存儲目錄下;
# 注意SecondaryNameNode服務(wù)配置在hop03上
[root@hop01 /] scp -r root@hop03:/opt/hadoop2.7/data/tmp/dfs/namesecondary/* /opt/hadoop2.7/data/tmp/dfs/name/
重新啟動NameNode進程;
2、基于Checkpoint機制
修改hdfs-site.xml配置,同步到集群相關(guān)服務(wù)下,重啟HDFS進程;
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>120</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/hadoop2.7/data/tmp/dfs/name</value>
</property>
結(jié)束NameNode進程;
刪除NameNode存儲的數(shù)據(jù);
[root@hop01 /] rm -rf /opt/hadoop2.7/data/tmp/dfs/name/*
由于集群中SecondaryNameNode(在hop03)不和NameNode(在hop01)在一個主機節(jié)點上,需要將SecondaryNameNode存儲數(shù)據(jù)的目錄拷貝到NameNode存儲數(shù)據(jù)的平級目錄,并刪除in_use.lock文件;
[root@hop01 /]scp -r root@hop03:/opt/hadoop2.7/data/tmp/dfs/namesecondary /opt/hadoop2.7/data/tmp/dfs/
[root@hop01 namesecondary/] rm -rf in_use.lock
[root@hop01 dfs]$ ls
data name namesecondary
導入檢查點數(shù)據(jù)
[root@hop01 hadoop2.7] bin/hdfs namenode -importCheckpoint
重新啟動NameNode
[root@hop01 hadoop2.7] sbin/hadoop-daemon.sh start namenode
四、多個目錄配置
NameNode可以配置多本地目錄,每個目錄存放內(nèi)容相同,增加運行的可靠性;
1、添加配置
# vim /opt/hadoop2.7/etc/hadoop/hdfs-site.xml
# 添加內(nèi)容如下
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name01,file:///${hadoop.tmp.dir}/dfs/name02</value>
</property>
該配置需要同步集群下所有服務(wù);
2、刪除原有數(shù)據(jù)
集群下所有服務(wù)都需要執(zhí)行該操作;
[root@hop01 hadoop2.7]# rm -rf data/ logs/
格式化NameNode之后重啟集群服務(wù)。
五、安全模式
1、基本描述
NameNode剛啟動時,會基于鏡像文件和編輯日志在內(nèi)存中加載文件系統(tǒng)元數(shù)據(jù)的映像,然后開始監(jiān)聽DataNode請求,該過程期間處于一個只讀的安全模式下,客戶端無法上傳文件,在該安全模式下DataNode會發(fā)送最新的數(shù)據(jù)塊列表信息到NameNode,如果滿足最小副本條件,NameNode在指定時間后就會退出安全模式。
2、安全模式
- 安全模式狀態(tài)
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode get
- 進入安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode enter
- 退出安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode leave
- 等待安全模式
/opt/hadoop2.7/bin/hdfs dfsadmin -safemode wait