1. 程式人生 > 其它 >HDFS中NameNode工作機制

HDFS中NameNode工作機制

引言

NameNode:

  1. 儲存元資料
  2. 管理整個HDFS叢集

DataNode:

儲存資料的block

SecondaryNameNode:

輔助HDFS完成一些事情

NameNode和SecondaryNameNode工作流程

編輯日誌檔案:edits

記載客戶端對HDFS的增刪改查的操作日誌

映象檔案:fsimage

記載元資料(HDFS上儲存的檔案目錄)及操作日誌

NameNode和SecondaryNameNode工作機制

工作流程詳解

  • 第一階段:namenode啟動
    • 第一次啟動namenode格式化後,建立fsimageedits檔案。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
    • 客戶端對元資料進行增刪改的請求。
    • namenode記錄操作日誌,更新滾動日誌。
    • namenode在記憶體中對資料進行增刪改查。
  • 第二階段:Secondary NameNode工作
    • Secondary NameNode詢問namenode是否需要checkpoint。直接帶回namenode是否檢查結果。
    • Secondary NameNode請求執行checkpoint
    • namenode滾動正在寫的edits日誌。
    • 將滾動前的編輯日誌和映象檔案拷貝到Secondary NameNode
    • Secondary NameNode載入編輯日誌和映象檔案到記憶體,併合並。
    • 生成新的映象檔案fsimage.chkpoint
    • 拷貝fsimage.chkpointnamenode
    • namenodefsimage.chkpoint重新命名成fsimage

chkpoint檢查的兩種觸發條件

  • 通常情況下,SecondaryNameNode每隔一小時執行一次檢查點操作。

   [hdfs-default.xml]

<!--兩次檢查點建立之間的固定時間間隔,預設3600,即1小時。所以去ann snn 看到的fsimage 相隔1個小時。-->

<property>
  <name>dfs.namenode.checkpoint.period</
name>   <value>3600</value> </property>
  • 一分鐘檢查namenode的事務數量。若檢查事務數達到這個值1,000,000,也觸發一次SecondaryNameNodecheckpoint操作。
<!--hdfs-site.xml檔案設定-->
<!--事務數量配置-->
<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上儲存的fsimage的數目,超出的會被刪除。預設儲存2個。-->
<property>
  <name>dfs.namenode.num.checkpoints.retained</name>
  <value>2</value>
</property>

映象檔案和編輯日誌檔案

namenode被格式化之後,將在/opt/app/hadoop/data/tmp/dfs/name/current目錄中產生如下檔案:

由於我的NameNode沒有格式化,只格式化了hadoop,並且將temp資料夾作為儲存日誌檔案的資料夾,所以以下檔案的訪問目錄均為:/opt/app/hadoop/temp/dfs/name/current

edits_0000000000000000000

fsimage_0000000000000000000.md5

seen_txid

VERSION

  • Fsimage檔案:HDFS檔案系統元資料的一個永久性的檢查點,其中包含HDFS檔案系統的所有目錄和檔案idnode的序列化資訊。
  • Edits檔案:存放HDFS檔案系統的所有更新操作的路徑,檔案系統客戶端執行的所有寫操作首先會被記錄到edits檔案中。
  • seentxid檔案:儲存的是一個數字,就是最後一個edits的數字
  • 每次Namenode啟動的時候都會將fsimage檔案讀入記憶體,並從00001開始到seen_txid中記錄的數字依次執行每個edits裡面的更新操作,保證記憶體中的元資料資訊是最新的、同步的,可以看成Namenode啟動的時候就將fsimage和edits檔案進行了合併。

Notes:這些檔案被意外刪除後將無法恢復,需謹慎!

NameNode版本號

如上圖:在/opt/app/hadoop/data/tmp/dfs/name/current這個目錄下檢視VERSION

namenode版本號具體解釋:

  • namespaceID:在HDFS上,會有多個Namenode,所以不同Namenode的namespaceID是不同的(主從架構:一個NameNode多個DataNode),分別管理一組blockpoolID。
  • clusterID:叢集id,全域性唯一
  • cTime:屬性標記了NameNode儲存系統的建立時間,對於剛剛格式化的儲存系統,這個屬性為0;但是在檔案系統升級之後,該值會更新到新的時間戳。
  • storageType:屬性說明該儲存目錄包含的是NameNode資料結構
  • blockpoolID:一個block pool id標識一個block pool,並且是跨叢集的全域性唯一。當一個新的Namespace被建立的時候(format過程的一部分)會建立並持久化一個唯一ID。在建立過程構建全域性唯一的BlockPoolID比人為的配置更可靠一些。NN將BlockPoolID持久化到磁碟中,在後續的啟動過程中,會再次load並使用。其針對每一個Namespace所對應blockpoolID,ID包括了其對應的NameNode節點的ip地址。
  • layoutVersion:是一個負整數。通常只有HDFS增加新特性時才會更新這個版本號。

SecondaryNameNode詳解

SecondaryNameNode目錄結構

SecondaryNameNode用來監控HDFS狀態的輔助後臺程式,每隔一段時間獲取HDFS元資料的快照。

檢視路徑:/opt/app/hadoop/data/tmp/dfs/namesecondary/current

SecondaryNameNodenamesecondary/current目錄和主NameNodecurrent目錄的佈局相同。好處:namenode發生故障時(假設沒有及時備份資料),可以從SecondaryNameNode恢復資料。

NameNode恢復資料的方法

首先模擬NameNode損壞,即殺死NameNode程序:

kill -9 程序ID:強制將某程序殺死

方法一:將SecondaryNameNode中資料拷貝到namenode儲存資料的目錄;

方法二:使用-importCheckpoint選項啟動namenode守護程序,從而將SecondaryNameNode中資料拷貝到namenode目錄中。

  • 案例實操(一):模擬namenode故障,並採用方法一,恢復namenode資料
    • kill -9 namenode程序/opt/app/hadoop/data/tmp/dfs/name

      rm -rf /opt/app/hadoop/data/tmp/dfs/name/*

      拷貝SecondaryNameNode中資料到原namenode儲存資料目錄

      cp -R /opt/app/hadoop/data/tmp/dfs/namesecondary/* /opt/app/hadoop/data/tmp/dfs/name/

      重新啟動namenode

      sbin/hadoop-daemon.sh start namenode

  • 案例實操(二):模擬namenode故障,並採用方法二,恢復namenode資料
    • 修改hdfs-site.xml中的
      <property>
        <name>dfs.namenode.checkpoint.period</name>
        <value>120</value>
      </property>
      <property>
        <name>dfs.namenode.name.dir</name>
        <value>/home/bigdata/hadoop-2.8.5/data/tmp/dfs/name</value>
      </property>
    • kill -9 namenode程序
    • 刪除namenode儲存的資料(/opt/app/hadoop/data/tmp/dfs/name

      rm -rf /opt/app/hadoop//data/tmp/dfs/name/*

    • 如果SecondaryNameNode不和Namenode在一個主機節點上,需要將SecondaryNameNode儲存資料的目錄拷貝到Namenode儲存資料的平級目錄

      [uek@node2 dfs]$ pwd

      /opt/app/hadoop/data/tmp/dfs

      [uek@node2 dfs]$ ls

      data name namesecondary

    • 匯入檢查點資料(等待一會ctrl+c結束掉)

      bin/hdfs namenode -importCheckpoint

    • 啟動namenode

      sbin/hadoop-daemon.sh start namenode

    • 如果提示檔案鎖了,可以刪除in_use.lock

      rm -rf /opt/app/hadoop/data/tmp/dfs/namesecondary/in_use.lock