hdfs之NameNode和SecondaryNameNode

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

  1. 通常情況下,SecondaryNameNode每隔一小時執行一次。
    [hdfs-default.xml]
<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property>
  1. 一分鐘檢查一次操作次數,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存儲數據的目錄;

  1. kill -9 NameNode進程
  2. 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
  1. 拷貝SecondaryNameNode中數據到原NameNode存儲數據目錄
scp -r atguigu@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
  1. 重新啓動NameNode
 sbin/hadoop-daemon.sh start namenode

方法二:使用-importCheckpoint選項啓動NameNode守護進程,從而將SecondaryNameNode中數據拷貝到NameNode目錄中。

  1. 修改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>
  1. kill -9 NameNode進程
  2. 刪除NameNode存儲的數據(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
  1. 如果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
  1. 導入檢查點數據(等待一會ctrl+c結束掉)
 bin/hdfs namenode -importCheckpoint
  1. 啓動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	(功能描述:等待安全模式狀態)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章