對未來真正的慷慨,是把一切獻給現在
NameNode和SecondaryNameNode作業機制

第一階段:NameNode啟動
(1)第一次啟動NameNode格式化后,創建Fsimage和Edits檔案,如果不是第一次啟動,直接加載編輯日志和鏡像檔案到記憶體,
Fsimage檔案(鏡像檔案):HDFS檔案系統元資料的一個永久性的檢查點,其中包含HDFS檔案系統的所有目錄和檔案idnode的序列化資訊,
Edits檔案(編輯日志):存放HDFS檔案系統的所有更新操作的路徑,檔案系統客戶端執行的所有寫操作首先會被記錄到edits檔案中,
(2)客戶端對元資料進行增刪改的請求,
(3)NameNode記錄操作日志,更新滾動日志,
【日志是為了到時候重啟的時候恢復HDFS】
【可以手動滾動日志 hdfs dfsadmin -rollEdits】
(4)NameNode在記憶體中對資料進行增刪改,
第二階段:Secondary NameNode作業
(1)Secondary NameNode詢問NameNode是否需要CheckPoint,直接帶回NameNode是否檢查結果,
(2)Secondary NameNode請求執行CheckPoint,
(3)NameNode滾動正在寫的Edits日志,
(4)將滾動前的編輯日志和鏡像檔案拷貝到Secondary NameNode,
(5)Secondary NameNode加載編輯日志和鏡像檔案到記憶體,并合并,
(6)生成新的鏡像檔案fsimage.chkpoint,
(7)拷貝fsimage.chkpoint到NameNode,
(8)NameNode將fsimage.chkpoint重新命名成fsimage,
? 由于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鏡像檔案
使用oiv命令,語法如下:
hdfs oiv -p 檔案型別 -i鏡像檔案 -o 轉換后檔案輸出路徑
hdfs oiv -p XML -i fsimage_0000000000000000025 -o /opt/module/hadoop-2.7.2/fsimage.xml
oev查看Edits編輯日志檔案
使用oev命令,語法如下:
hdfs oev -p 檔案型別 -i編輯日志 -o 轉換后檔案輸出路徑
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
CheckPoint時間設定
觸發SecondaryNameNode執行checkpoint保存資料的條件有兩種:時間和次數
【1】通常SNN每隔一小時執行一次,配置hdfs-default.xml
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property >
【2】當操作次數達到100完次時候
<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 >
相關資料

本文配套GitHub:https://github.com/zhutiansama/FocusBigData
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/149318.html
標籤:Java
