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>