HDFS的Secondarynamenode工作機制

 

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 合併

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>
  1. SecondaryNameNode 通知 NameNode 切換 editlog
  2. SecondaryNameNode 從 NameNode 中獲得 fsimage 和 editlog(通過http方式)
  3. SecondaryNameNode 將 fsimage 載入內存, 然後開始合併 editlog, 合併之後成爲新的 fsimage
  4. SecondaryNameNode 將新的 fsimage 發回給 NameNode
  5. 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 放在不同的機器上
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章