1.5.6 NN與2NN 1.5.6.1 HDFS元數據管理機制 問題1:NameNode如何管理和存儲元數據? 電腦中存儲數據兩種:記憶體或者是磁碟 元數據存儲磁碟:存儲磁碟無法面對客戶端對元數據信息的任意的快速低延遲的響應,但是安全性高 元數據存儲記憶體:元數據存放記憶體,可以高效的查詢以及快速響應 ...
目錄
1.5.6 NN與2NN
1.5.6.1 HDFS元數據管理機制
問題1:NameNode如何管理和存儲元數據?
電腦中存儲數據兩種:記憶體或者是磁碟
元數據存儲磁碟:存儲磁碟無法面對客戶端對元數據信息的任意的快速低延遲的響應,但是安全性高
元數據存儲記憶體:元數據存放記憶體,可以高效的查詢以及快速響應客戶端的查詢請求,數據保存在內 存,如果斷點,記憶體中的數據全部丟失。
解決方案:記憶體+磁碟;NameNode記憶體+FsImage的文件(磁碟)
新問題:磁碟和記憶體中元數據如何劃分?
兩個數據一模一樣,還是兩個數據合併到一起才是一份完整的數據呢?
一模一樣:client如果對元數據進行增刪改操作,需要保證兩個數據的一致性。FsImage文件操作起來 效率也不高。
兩個合併=完整數據:NameNode引入了一個edits文件(日誌文件:只能追加寫入)edits文件記錄的 是client的增刪改操作,
不再選擇讓NameNode把數據dump出來形成FsImage文件(這種操作是比較消耗資源)。
元數據管理流程圖
-
第一階段:NameNode啟動
-
第一次啟動NameNode格式化後,創建Fsimage和Edits文件。如果不是第一次啟動,直接載入編輯日誌和鏡像文件到記憶體。
-
客戶端對元數據進行增刪改的請求。
-
NameNode記錄操作日誌,更新滾動日誌。
-
NameNode在記憶體中對數據進行增刪改。
-
-
第二階段:Secondary NameNode工作
- Secondary NameNode詢問NameNode是否需要CheckPoint。直接帶回NameNode是否執行檢查點操作結果。
- Secondary NameNode請求執行CheckPoint。
- NameNode滾動正在寫的Edits日誌。
- 將滾動前的編輯日誌和鏡像文件拷貝到Secondary NameNode。
- Secondary NameNode載入編輯日誌和鏡像文件到記憶體,併合並。
- 生成新的鏡像文件fsimage.chkpoint。
- 拷貝fsimage.chkpoint到NameNode。
- NameNode將fsimage.chkpoint重新命名成fsimage。
1.5.6.2 Fsimage與Edits文件解析
NameNode在執行格式化之後,會在/opt/lagou/servers/hadoop-2.9.2/data/tmp/dfs/name/current目錄下產生如下文件
- Fsimage文件:是namenode中關於元數據的鏡像,一般稱為檢查點,這裡包含了HDFS文件系統所有目錄以及文件相關信息(Block數量,副本數量,許可權等信息)
- Edits文件 :存儲了客戶端對HDFS文件系統所有的更新操作記錄,Client對HDFS文件系統所有的更新操作都會被記錄到Edits文件中(不包括查詢操作)
- seen_txid:該文件是保存了一個數字,數字對應著最後一個Edits文件名的數字
- VERSION:該文件記錄namenode的一些版本號信息,比如:CusterId,namespaceID等
1.5.6.2.1 Fsimage文件內容
官方地址https://hadoop.apache.org/docs/r2.9.2/hadoop-project-dist/hadoop-hdfs/HdfsImageViewer.html
-
查看oiv和oev命令
[root@linux121 current]$ hdfs oiv Offline Image Viewer View a Hadoop fsimage INPUTFILE using the specified PROCESSOR,saving the results in OUTPUTFILE. oev Offline edits viewer Parse a Hadoop edits log file INPUT_FILE and save results in OUTPUT_FILE
-
基本語法
hdfs oiv -p 文件類型(xml) -i 鏡像文件 -o 轉換後文件輸出路徑
-
案例實操
[root@linux121 current]$ cd /opt/lagou/servers/hadoop-2.9.2/data/tmp/dfs/name/current [root@linux121 current]$ hdfs oiv -p XML -i fsimage_0000000000000000265 -o /opt/lagou/servers/fsimage.xml [root@linux121 current]$ cat /opt/lagou/servers/fsimage.xml
<?xml version="1.0"?> <fsimage> <version> <layoutVersion>-63</layoutVersion> <onDiskVersion>1</onDiskVersion> <oivRevision>826afbeae31ca687bc2f8471dc841b66ed2c6704</oivRevision> </version> <NameSection> <namespaceId>1393381414</namespaceId> <genstampV1>1000</genstampV1> <genstampV2>1024</genstampV2> <genstampV1Limit>0</genstampV1Limit> <lastAllocatedBlockId>1073741848</lastAllocatedBlockId> <txid>265</txid> </NameSection> <INodeSection> <inode> <id>16398</id> <type>DIRECTORY</type> <name>history</name> <mtime>1592376391028</mtime> <permission>root:supergroup:0777</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16399</id> <type>DIRECTORY</type> <name>done_intermediate</name> <mtime>1592375256896</mtime> <permission>root:supergroup:1777</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16400</id> <type>DIRECTORY</type> <name>root</name> <mtime>1592378079208</mtime> <permission>root:supergroup:0777</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16413</id> <type>FILE</type> <name>job_1592375222804_0001-1592375231176-root-word+count-1592375281926-1-1-SUCCEEDED-default- 1592375261492.jhist</name> <replication>3</replication> <mtime>1592375282039</mtime> <atime>1592375281980</atime> <preferredBlockSize>134217728</preferredBlockSize> <permission>root:supergroup:0777</permission> <blocks> <block> <id>1073741834</id> <genstamp>1010</genstamp> <numBytes>33584</numBytes> </block> </blocks> <storagePolicyId>0</storagePolicyId> </inode> <inode> <id>16414</id> <type>FILE</type> <name>job_1592375222804_0001_conf.xml</name> <replication>3</replication> <mtime>1592375282121</mtime> <atime>1592375282053</atime> <preferredBlockSize>134217728</preferredBlockSize> <permission>root:supergroup:0777</permission> <blocks> <block> <id>1073741835</id> <genstamp>1011</genstamp> <numBytes>196027</numBytes> </block> </blocks> <storagePolicyId>0</storagePolicyId> </inode> <inode> <id>16415</id> <type>DIRECTORY</type> <name>done</name> <mtime>1592376776670</mtime> <permission>root:supergroup:0777</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16427</id> <type>DIRECTORY</type> <name>logs</name> <mtime>1592378009623</mtime> <permission>root:root:0770</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16428</id> <type>DIRECTORY</type> <name>application_1592376944601_0001</name> <mtime>1592378045481</mtime> <permission>root:root:0770</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16430</id> <type>DIRECTORY</type> <name>wcoutput</name> <mtime>1592378037463</mtime> <permission>root:supergroup:0755</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16436</id> <type>FILE</type> <name>part-r-00000</name> <replication>3</replication> <mtime>1592378037264</mtime> <atime>1592378037074</atime> <preferredBlockSize>134217728</preferredBlockSize> <permission>root:supergroup:0644</permission> <blocks> <block> <id>1073741842</id> <genstamp>1018</genstamp> <numBytes>43</numBytes> </block> </blocks> <storagePolicyId>0</storagePolicyId> </inode> <inode> <id>16445</id> <type>FILE</type> <name>linux123_39919</name> <replication>3</replication> <mtime>1592378045469</mtime> <atime>1592378045331</atime> <preferredBlockSize>134217728</preferredBlockSize> <permission>root:root:0640</permission> <blocks> <block> <id>1073741848</id> <genstamp>1024</genstamp> <numBytes>56910</numBytes> </block> </blocks> <storagePolicyId>0</storagePolicyId> </inode> <inode> <id>16446</id> <type>DIRECTORY</type> <name>0617</name> <mtime>1592387393490</mtime> <permission>root:supergroup:0755</permission> <nsquota>-1</nsquota> <dsquota>-1</dsquota> </inode> <inode> <id>16449</id> <type>FILE</type> <name>banzhang.txt</name> <replication>1</replication> <mtime>1592388309046</mtime> <atime>1592388309026</atime> <preferredBlockSize>134217728</preferredBlockSize> <permission>root:supergroup:0644</permission> <storagePolicyId>0</storagePolicyId> </inode> </INodeSection> </fsimage>
問題:Fsimage中為什麼沒有記錄塊所對應DataNode?
在記憶體元數據中是有記錄塊所對應的dn信息,但是fsimage中就剔除了這個信息;HDFS集群在啟動的 時候會載入image以及edits文件,block對應的dn信息
都沒有記錄,集群啟動時會有一個安全模式 (safemode),安全模式就是為了讓dn彙報自己當前所持有的block信息給nn來補全元數據。後續每隔一段時間dn
都要彙報自己持有的block信息。
1.5.6.2.2 Edits文件內容
- 基本語法
hdfs oev -p 文件類型 -i編輯日誌 -o 轉換後文件輸出路徑
-
案例實操
[root@linux121 current]$ hdfs oev -p XML -i edits_0000000000000000266- 0000000000000000267 -o /opt/lagou/servers/hadoop-2.9.2/edits.xml [root@linux121 current]$ cat /opt/lagou/servers/hadoop-2.9.2/edits.xml
<?xml version="1.0" encoding="UTF-8"?> <EDITS> <EDITS_VERSION>-63</EDITS_VERSION> <RECORD> <OPCODE>OP_START_LOG_SEGMENT</OPCODE> <DATA> <TXID>113</TXID> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>114</TXID> <SRC>/wcoutput/_SUCCESS</SRC> <MODE>493</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>115</TXID> <SRC>/wcoutput/part-r-00000</SRC> <MODE>493</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>116</TXID> <SRC>/wcoutput</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>117</TXID> <SRC>/wcoutput/_SUCCESS</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>118</TXID> <SRC>/wcoutput/part-r-00000</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_DELETE</OPCODE> <DATA> <TXID>119</TXID> <LENGTH>0</LENGTH> <PATH>/wcoutput/part-r-00000</PATH> <TIMESTAMP>1592377324171</TIMESTAMP> <RPC_CLIENTID></RPC_CLIENTID> <RPC_CALLID>-2</RPC_CALLID> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>120</TXID> <SRC>/</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>121</TXID> <SRC>/tmp</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>122</TXID> <SRC>/tmp/hadoop-yarn</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>123</TXID> <SRC>/tmp/hadoop-yarn/staging</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>124</TXID> <SRC>/tmp/hadoop-yarn/staging/history</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>125</TXID> <SRC>/tmp/hadoop-yarn/staging/history/done</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD> <OPCODE>OP_SET_PERMISSIONS</OPCODE> <DATA> <TXID>126</TXID> <SRC>/tmp/hadoop-yarn/staging/history/done/2020</SRC> <MODE>511</MODE> </DATA> </RECORD> <RECORD>
備註:Edits中只記錄了更新相關的操作,查詢或者下載文件並不會記錄在內!!
問題:NameNode啟動時如何確定載入哪些Edits文件呢?
nn啟動時需要載入fsimage文件以及那些沒有被2nn進行合併的edits文件,nn如何判斷哪些edits已經被合併了呢?
可以通過fsimage文件自身的編號來確定哪些已經被合併。
1.5.6.3 checkpoint周期
[hdfs-default.xml]
<!-- 定時一小時 -->
<property>
<name>dfs.namenode.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一分鐘檢查一次操作次數,當操作次數達到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>