1. 程式人生 > 其它 >HDFS05 NameNode和SecondaryNameNode

HDFS05 NameNode和SecondaryNameNode

NameNode和SecondaryNameNode

目錄

NN 和 2NN 工作機制

問題1:NN的元資料儲存在記憶體中還是磁碟中?

儲存點 好處 壞處
記憶體 計算快 可靠性差
磁碟 可靠性高 計算速度慢

總和兩者的好處,採用記憶體加磁碟的儲存方式儲存,磁碟中備份元資料Fslmage映象檔案。
如果記憶體中計算出結果之後,寫入磁碟中,效率過低。引入了Edits編輯日誌。

三個地方儲存的內容
Fsimage:NameNode記憶體中元資料序列化後形成的檔案。
Edits:記錄客戶端更新元資料資訊的每一步操作(可通過Edits運算出元資料)。
記憶體中有的資料=fslmage映象檔案的資料+Edits的操作

伺服器一啟動將 fslmage映象檔案的資料+Edits的操作 的結果載入到記憶體。因此,需要定期進行 FsImage 和 Edits 的合併,引入一個新的節點SecondaryNamenode,協助nn在過程中 FsImage 和 Edits 的合併。

NameNode工作機制

1.第一次啟動 NameNode 格式化後,建立 Fsimage映象檔案、和 Edits編輯日誌檔案edits_inprogress_001。如果不是第一次啟動,直接載入編輯日誌和映象檔案到記憶體。
2.客戶端對元資料訪問,如增刪改請求。
3.記錄操作日誌、更新滾動日誌。
4.NameNode 在記憶體中對元資料進行增刪改。

Secondary NameNode

1.Secondary NameNode 詢問 NameNode 是否需要 CheckPoint,直接帶回 NameNode是否檢查結果。

問題1:多久詢問一次NameNode,checkPoint觸發條件。
①定時時間到了,預設一個小時
②Edits中的資料滿了

2.Secondary NameNode 請求執行 CheckPoint。
3.NameNode 滾動正在寫的Edits日誌。

問題2:怎麼滾動的?
edits滾動生成一個新的edits.inprogress檔案edits_inprogress_002。原來的edits_inprogress_001修改名稱為edits_001,之後的操作都記錄在edits_inprogress_002。

4.將edits_001和映象檔案fsimage拷貝到Secondary NameNode。
5.Secondary NameNode 載入編輯日誌edits_001和映象檔案到記憶體。
6.合併生成新的映象檔案fsimage.chkpoint。
7.拷貝 fsimage.chkpoint 到 NameNode。
8.NameNode 將 fsimage.chkpoint 重新命名成 fsimage。

下次啟動就將新的fsimage和edits_inprogress_002的內容加在一起就是最新的元資料。

Fsimage 和 Edits 解析

NameNode伺服器在hadoop102,在NameNode目錄下有Fsiamge和Edits檔案,NameNode目錄/opt/module/hadoop-3.1.3/data/dfs/name/current

Secondary NameNode伺服器在hadoop104,Secondary NameNode目錄/opt/module/hadoop-3.1.3/data/dfs/namesecondary/current/

NameNode比Secondary NameNode多一個edits_inprogress_xxxx,最新的操作

NameNode在格式化(初始化)之後,會在/opt/module/hadoop-3.1.3/data/dfs/name/current目錄中產生如下檔案

oiv檢視 Fsimage 檔案

oiv和oev檢視命令

oiv 檢視Fsiamge檔案
oev 檢視Edits檔案

基本語法

dfs oiv -p 檔案型別 -i 映象檔案 -o 轉換後文件輸出路徑

正常通過cat看映象檔案看不了,全是亂碼,需要通過-p把映象檔案轉換成其他格式,輸出在其他路徑下。

案例

[ranan@hadoop102 current]$ hdfs oiv -p XML -i fsimage_0000000000000000363 -o /opt/software/fsimage.xml

將fsimage.xml下載到桌面,SecureCRT設定預設下載/上傳路徑

[ranan@hadoop102 software]$ sz fsimage.xml

fsimage.xml檔案內容理解

引用文章

檔案組成

<INodeDirectorySection> 
	<inode> ... </inode>
	<inode> ... </inode>
</INodeDirectorySection>
<INodeDirectorySection>..</INodeDirectorySection>
<INodeDirectorySection>..</INodeDirectorySection>

主要內容

<inode>
    <id>16417</id>
    <type>FILE</type>         ------ 檔案型別:常規檔案(如果是資料夾則為 'DIRECTORY')
    <name>b.xml</name>       ----- 檔名
    <replication>3</replication> --- 副本數
    <mtime>1603342078483</mtime> --- 建立時間
    <atime>1603342078253</atime> --- 修改時間
    <perferredBlockSize>134217728</perferredBlockSize> --- 塊大小
    <permission>ranan:supergroup:rw-r--r--</permission> --- 許可權
    <blocks>                                          ---- 被切成了幾個塊
        <block>                                       ---- 第一個塊
            <id>1073741836</id>     ----- 塊的id
            <genstamp>1013</genstamp> --- 塊的時間戳
            <numBytes>313</numBytes>  --- 塊中存放的資料的大小(該檔案只有一個塊,該大小即為檔案大小)
        </block>
    </blocks>
</inode>

問題:Fsimage 中沒有記錄塊所對應 DataNode,為什麼?
在叢集啟動後,要求 DataNode 上報資料塊資訊,並間隔一段時間後再次上報。

oev檢視Edits檔案

基本語法

dfs oev -p 檔案型別 -i 日誌檔案 -o 轉換後文件輸出路徑

正常通過cat看映象檔案看不了,全是亂碼,需要通過-p把映象檔案轉換成其他格式,輸出在其他路徑下。

案例

[ranan@hadoop102 current]$ hdfs oev -p XML -i edits_inprogress_0000000000000000400 -o /opt/software/edits.xml

將edits.xml下載到桌面

[ranan@hadoop102 software]$ sz edits.xml

edits.xml檔案內容理解

引用文章

檔案組成

一個edits檔案記錄了一次寫檔案的過程,該過程被分解成多個部分進行記錄;(每條記錄在hdfs中有一個編號)

<RECORD>    ---一個部分
<OPCODE> ... </OPCODE>
<DATA> ... </DATA>
</RECORD>

<RECORD>    ---一個部分
<OPCODE> ... </OPCODE>
<DATA> ... </DATA>
</RECORD>

檔案內容理解,寫入a.xml

1.檔案首<OPCODE>OP_START_LOG_SEGMENT</OPCODE>

<RECORD>
    <OPCODE>OP_START_LOG_SEGMENT</OPCODE>   --- 表示對一次寫操作記錄的開始
    <DATA>
      <TXID>138</TXID>               ---------- HDFS的第138號記錄
    </DATA>
</RECORD>

2.寫入臨時資料夾 <OPCODE>OP_ADD</OPCODE>
寫入 'a.xml' 檔案的過程中,會先將檔案寫到臨時檔案a.xml._COPYING_中,最後再將該檔案重新命名後存放到DN;

<RECORD>
    <OPCODE>OP_ADD</OPCODE>     ------------- 寫檔案操作
    <DATA>
      <TXID>139</TXID>       ---------------- HDFS的第139號記錄
      <LENGTH>0</LENGTH>
      <INODEID>16416</INODEID>
      <PATH>/a.xml._COPYING_</PATH>       --- 寫'a.xml'檔案的過程中生成臨時檔案'a.xml._COPYING'
      <REPLICATION>3</REPLICATION>        --- 副本數
      <MTIME>1603341874966</MTIME>        --- 建立時間
      <ATIME>1603341874966</ATIME>        --- 修改時間
      <BLOCKSIZE>134217728</BLOCKSIZE>    --- 檔案塊的大小:128M
      <CLIENT_NAME>DFSClient_NONMAPREDUCE_-1327338057_1</CLIENT_NAME>   ---- 來源哪個客戶端
      <CLIENT_MACHINE>192.168.10.102</CLIENT_MACHINE>        --------------- 通過哪個機器上傳的
      <OVERWRITE>true</OVERWRITE>                            --------------- 是否允許被覆蓋
      <PERMISSION_STATUS>                                         ---------- 許可權資訊
        <USERNAME>ranan</USERNAME>                                 ---------- 所屬主
        <GROUPNAME>supergroup</GROUPNAME>                         ---------- 所屬組
        <MODE>420</MODE>                                          ---------- 許可權大小(777最大)
      </PERMISSION_STATUS>
      <RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID> ---- 叢集ID
      <RPC_CALLID>3</RPC_CALLID>
    </DATA>
  </RECORD>

3.分配塊id<OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE>

<RECORD>
    <OPCODE>OP_ALLOCATE_BLOCK_ID</OPCODE> ---- 表示該步為記錄 “定義塊ID”
    <DATA>
      <TXID>140</TXID>                    ---- HDFS的第140號記錄
      <BLOCK_ID>1073741835</BLOCK_ID>    ----- 塊ID
    </DATA>
 </RECORD>

4.為塊生成一個時間戳<OPCODE>OP_SET_GENSTAMP_V2</OPCODE>

<RECORD>
    <OPCODE>OP_SET_GENSTAMP_V2</OPCODE>
    <DATA>
      <TXID>141</TXID>
      <GENSTAMPV2>1012</GENSTAMPV2>
    </DATA>
</RECORD>

5.新增塊<OPCODE>OP_ADD_BLOCK</OPCODE>

<RECORD>
    <OPCODE>OP_ADD_BLOCK</OPCODE>
    <DATA>
      <TXID>142</TXID>
      <PATH>/a.xml._COPYING_</PATH>
      <BLOCK>
        <BLOCK_ID>1073741835</BLOCK_ID>
        <NUM_BYTES>0</NUM_BYTES>
        <GENSTAMP>1012</GENSTAMP>
      </BLOCK>
      <RPC_CLIENTID></RPC_CLIENTID>
      <RPC_CALLID>-2</RPC_CALLID>
    </DATA>
 </RECORD>

6.封閉檔案<OPCODE>OP_CLOSE</OPCODE>

<RECORD>
    <OPCODE>OP_CLOSE</OPCODE>
    <DATA>
      <TXID>143</TXID>
      <LENGTH>0</LENGTH>
      <INODEID>0</INODEID>
      <PATH>/a.xml._COPYING_</PATH>
      <REPLICATION>3</REPLICATION>
      <MTIME>1603341875516</MTIME>
      <ATIME>1603341874966</ATIME>
      <BLOCKSIZE>134217728</BLOCKSIZE>
      <CLIENT_NAME></CLIENT_NAME>
      <CLIENT_MACHINE></CLIENT_MACHINE>
      <OVERWRITE>false</OVERWRITE>
      <BLOCK>
        <BLOCK_ID>1073741835</BLOCK_ID>
        <NUM_BYTES>313</NUM_BYTES>
        <GENSTAMP>1012</GENSTAMP>
      </BLOCK>
      <PERMISSION_STATUS>
        <USERNAME>ranan</USERNAME>
        <GROUPNAME>supergroup</GROUPNAME>
        <MODE>420</MODE>
      </PERMISSION_STATUS>
    </DATA>
  </RECORD>

7.重新命名臨時檔案 'a.xml.COPYING' 為 'a.xml' <OPCODE>OP_RENAME_OLD</OPCODE>

<RECORD>
    <OPCODE>OP_RENAME_OLD</OPCODE>
    <DATA>
      <TXID>144</TXID>
      <LENGTH>0</LENGTH>
      <SRC>/a.xml._COPYING_</SRC>
      <DST>/a.xml</DST>
      <TIMESTAMP>1603341875552</TIMESTAMP>
      <RPC_CLIENTID>3299ce83-ba14-4468-8cf8-b5edb5dea153</RPC_CLIENTID>
      <RPC_CALLID>8</RPC_CALLID>
    </DATA>
</RECORD>

問題:NameNode如何確定下次開機啟動的時候合併哪些Edits

注意時間,看到每間隔1h進行一次合併
叢集開關機要合併一次

CheckPoint時間設定

hdfs-default.xml

1.通常情況下,SecondaryNameNode每隔一小時執行一次CheckPoint

<property> 
  <name>dfs.namenode.checkpoint.period</name> 
  <value>3600s</value> 
</property> 

2.一分鐘檢查一次操作次數,當操作次數達到 1 百萬時,SecondaryNameNode執行一次CheckPoint

<property> 
  <name>dfs.namenode.checkpoint.txns</name> 
  <value>1000000</value> 
<description>操作動作次數</description> 
</property> 

<property> 
  <name>dfs.namenode.checkpoint.check.period</name> 
  <value>60s</value> 
<description> 1 分鐘檢查一次操作次數</description> 
</property>