HDFS 的元信息和 SecondaryNameNode
當 Hadoop 的集羣當中, 只有一個 NameNode 的時候, 所有的元數據信息都保存在了 FsImage 與 Eidts 文件當中, 這兩個文件就記錄了所有的數據的元數據信息, 元數據信息的保存目錄配置在了 hdfs-site.xml
當中
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/namenode/namenodedatas</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/servers/hadoop-3.1.1/datas/dfs/nn/edits</value>
</property>
FsImage 和 Edits 詳解
-
edits
edits
存放了客戶端最近一段時間的操作日誌- 客戶端對 HDFS 進行寫文件時會首先被記錄在
edits
文件中 edits
修改時元數據也會更新- 每次 HDFS 更新時
edits
先更新後客戶端纔會看到最新信息
-
fsimage
- NameNode 中關於元數據的鏡像, 一般稱爲檢查點,
fsimage
存放了一份比較完整的元數據信息 - 因爲
fsimage
是 NameNode 的完整的鏡像, 如果每次都加載到內存生成樹狀拓撲結構,這是非常耗內存和CPU, 所以一般開始時對 NameNode 的操作都放在 edits 中 fsimage
內容包含了 NameNode 管理下的所有 DataNode 文件及文件 block 及 block 所在的 DataNode 的元數據信息.- 隨着
edits
內容增大, 就需要在一定時間點和fsimage
合併
- NameNode 中關於元數據的鏡像, 一般稱爲檢查點,
fsimage 中的文件信息查看
使用命令 hdfs oiv
cd /export/servers/hadoop-3.1.1/datas/namenode/namenodedatas
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
edits 中的文件信息查看
使用命令 hdfs oev
cd /export/servers/hadoop-3.1.1/datas/dfs/nn/edits
hdfs oev -i edits_0000000000000000865-0000000000000000866 -o myedit.xml -p XML
SecondaryNameNode 如何輔助管理 fsimage 與 edits 文件?
-
SecondaryNameNode 定期合併 fsimage 和 edits, 把 edits 控制在一個範圍內
-
配置 SecondaryNameNode
-
SecondaryNameNode 在
conf/masters
中指定 -
在 masters 指定的機器上, 修改
hdfs-site.xml
-
<property>
<name>dfs.http.address</name>
<value>host:50070</value>
</property>
修改 core-site.xml
, 這一步不做配置保持默認也可以
<!-- 多久記錄一次 HDFS 鏡像, 默認 1小時 -->
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一次記錄多大, 默認 64M -->
<property>
<name>fs.checkpoint.size</name>
<value>67108864</value>
</property>
- SecondaryNameNode 通知 NameNode 切換 editlog
- SecondaryNameNode 從 NameNode 中獲得 fsimage 和 editlog(通過http方式)
- SecondaryNameNode 將 fsimage 載入內存, 然後開始合併 editlog, 合併之後成爲新的 fsimage
- SecondaryNameNode 將新的 fsimage 發回給 NameNode
- NameNode 用新的 fsimage 替換舊的 fsimage
- 完成合並的是 SecondaryNameNode, 會請求 NameNode 停止使用 edits, 暫時將新寫操作放入一個新的文件中
edits.new
- SecondaryNameNode 從 NameNode 中通過 Http GET 獲得 edits, 因爲要和 fsimage 合併, 所以也是通過 Http Get 的方式把 fsimage 加載到內存, 然後逐一執行具體對文件系統的操作, 與 fsimage 合併, 生成新的 fsimage, 然後通過 Http POST 的方式把 fsimage 發送給 NameNode. NameNode 從 SecondaryNameNode 獲得了 fsimage 後會把原有的 fsimage 替換爲新的 fsimage, 把 edits.new 變成 edits. 同時會更新 fstime
- Hadoop 進入安全模式時需要管理員使用 dfsadmin 的 save namespace 來創建新的檢查點
- SecondaryNameNode 在合併 edits 和 fsimage 時需要消耗的內存和 NameNode 差不多, 所以一般把 NameNode 和 SecondaryNameNode 放在不同的機器上