NameNode&Secondary NameNode 工作機制
NameNode:
1.啟動時,加載編輯日志和鏡像文件到內存
2.當客戶端對元數據進行增刪改,請求NameNode
3.NameNode記錄操作日志,更新滾動日志
4.日志記錄完成,在NameNode內存中對元數據進行操作
edits.001 操作日志
edits.002
edits.inprogress 正在進行的操作日志
fsimage 鏡像文件
SecondaryNameNode:(其主要作用就是:合並edit和fsimage)
0.檢查點(checkpoint)觸發。條件是:
a.定時時間到(默認一個小時)
b.操作日志中的數據滿了(100w次操作)
1.請求NameNode是否需要CheckPoint,直接帶回 NameNode是否檢查結果
2.執行CheckPoint請求
3.滾動正在寫的操作日志,生成最新的一個操作日志
4.將操作日志和之前舊的鏡像fsimage文件拷貝到SecondaryNameNode
5.在SecondaryNameNode內存中合並日志文件和fsimage文件
6.生成新的fsimage.chkpoint
7.將fsimage.chkpoint拷貝到NameNode中
8.重命名fsimage.chkpoint為fsimage
日志文件
目錄結構:
$HADOOP_HOME/data/tmp/dfs/name/current
$HADOOP_DATA_HOME/tmp/dfs/name/current
edits_0000000000000000000
fsimage_0000000000000000000.md5
seen_txid
VERSION
1.fsimage:
HDFS 文件系統元數據的一個永久性的檢查點,其中包含 HDFS文件系統的所有目錄和文件 idnode 的序列化信息
2.edits:
存放 HDFS 文件系統的所有更新操作的路徑,文件系統客戶端執行的所有寫操作首先會被記錄到 edits 文件中。
3.seen_txid:
文件保存的是一個數字,就是最后一個 edits_的數字
每次 Namenode 啟動的時候都會將 fsimage 文件讀入內存,
並從 00001 開始到 seen_txid 中記錄的數字依次執行每個 edits 里面的更新操作,
保證內存中的元數據信息是最新的、同步的,可以看成 Namenode 啟動的時候就將 fsimage 和 edits 文件進行了合並。
查看fsimage文件和edits文件
oiv 查看 fsimage 文件
hdfs oiv -p 文件類型 -i 鏡像文件 -o 轉換后文件輸出路徑
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
oev 查看 edits 文件
hdfs oev -p 文件類型 -i 編輯日志 -o 轉換后文件輸出路徑
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
chkpoint 檢查 時間 參數 設置
hdfs-default.xml
<!-- 默認:SecondaryNameNode 每隔一小時執行一次 -->
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一分鍾檢查一次操作次數,當操作次數達到 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 的本地目錄可以配置成多個,且每個目錄存放內容相同,增加了可靠性。
配置步驟:
(1)在 hdfs-site.xml 文件中增加如下內容
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value>
</property>
(2)停止集群,刪除 data 和 logs 中所有數據
$ rm -rf data/ logs/
(3)格式化集群並啟動。
$ bin/hdfs namenode –format
$ sbin/start-dfs.sh
本博客僅為博主學習總結,感謝各大網絡平台的資料。蟹蟹!!