HDFS metadata以樹狀結構存儲整個HDFS上的文件和目錄,以及相應的權限、配額和副本因子(replication factor)等。本文基於hadoop2.6-cdh5.16.2版本介紹HDFS Namenode本地目錄的存儲結構和Datanode數據塊存儲目錄結構以及SecondaryName數據存儲目錄結構。
官網架構圖:
一、NameNode:主
> 存儲:文件系統的命名空間
1、文件的名稱
2、文件的目錄結構
3、文件的屬性、權限、創建時間和副本數
4、文件對應被切割爲哪些數據塊+副本數 --> 數據塊分佈在哪些NN節點上
> 作用:
管理文件系統的命名空間。維護文件系統樹的所有文件及文件夾。這些信息會以兩個文件形式永久的保存在本地磁盤上:
》鏡像文件fsimage:記錄某一永久性檢查點(Checkpoint)時整個HDFS的元信息
》編輯日誌文件editlog:所有對HDFS的寫操作都會記錄在此文件中
通過下圖可以看到分別有三個角色,分別對應datanode、namenode和secondaryname角色
我們先進入到name目錄對其進行分析:
1、edits 編輯日誌:
當客戶端執行寫操作時,首選NN會在編輯日誌中寫下記錄,並在內存中保存一個文件系統元數據,這個描述符會在編輯日誌改動之後更新。格式: edits_start transaction ID -end transaction ID
我們通過下面命令查看:
hdfs oev -i edits_0000000000000000001-0000000000000000001 -o ~/tmp/edits.xml
2、fsimage
<?xml version="1.0"?>
<fsimage>
<version>
<layoutVersion>-60</layoutVersion>
<onDiskVersion>1</onDiskVersion>
<oivRevision>4f94d60caa4cbb9af0709a2fd96dc3861af9cf20</oivRevision>
</version>
<NameSection>
<namespaceId>861865381</namespaceId>
<genstampV1>1000</genstampV1>
<genstampV2>1014</genstampV2>
<genstampV1Limit>0</genstampV1Limit>
<lastAllocatedBlockId>1073741838</lastAllocatedBlockId>
<txid>130</txid>
</NameSection>
<INodeSection>
<lastInodeId>16418</lastInodeId>
<numInodes>19</numInodes>
<inode>
<id>16385</id>
<type>DIRECTORY</type>
<name></name>
<mtime>1583259045953</mtime>
<permission>ruoze:supergroup:0755</permission>
<nsquota>9223372036854775807</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16386</id>
<type>DIRECTORY</type>
<name>czz</name>
<mtime>1583256491538</mtime>
<permission>czz:supergroup:0755</permission>
<nsquota>-1</nsquota>
<dsquota>-1</dsquota>
</inode>
<inode>
<id>16387</id>
<type>FILE</type>
<name>yarn-site.xml</name>
<replication>1</replication>
<mtime>1583256491531</mtime>
<atime>1583256490783</atime>
<preferredBlockSize>134217728</preferredBlockSize>
<permission>ruoze:supergroup:0644</permission>
<blocks>
<block>
<id>1073741825</id>
<genstamp>1001</genstamp>
<numBytes>690</numBytes>
</block>
</blocks>
<storagePolicyId>0</storagePolicyId>
</inode>
<SnapshotSection>
<snapshotCounter>0</snapshotCounter>
<numSnapshots>0</numSnapshots>
</SnapshotSection>
<INodeDirectorySection>
<directory>
<parent>16385</parent>
<child>16386</child>
<child>16391</child>
<child>16389</child>
<child>16405</child>
</directory>
</INodeDirectorySection>
</fsimage>
鏡像文件中的一些參數下面會有介紹,請繼續下看
3、seen_txid
保存最近一次fsimage或者edits_inprogress的transaction ID。需要注意的是,這並不是Namenode當前最新的transaction ID,該文件只有在checkpoing(merge of edits into a fsimage)或者edit log roll(finalization of current edits_inprogress and creation of a new one)時纔會被更新。
這個文件的目的在於判斷在Namenode啓動過程中是否有丟失的edits,由於edits和fsimage可以配置在不同目錄,如果edits目錄被意外刪除了,最近一次checkpoint後的所有edits也就丟失了,導致Namenode狀態並不是最新的,爲了防止這種情況發生,Namenode啓動時會檢查seen_txid,如果無法加載到最新的transactions,Namenode進程將不會完成啓動以保護數據一致性。
4、VERSION
> layoutVersion: HDFS metadata版本號,通常只有HDFS增加新特性時纔會更新這個版本號
> namespaceID/clusterID/blockpoolID: 這三個ID在整個HDFS集羣全局唯一,作用是引導Datanode加入同一個集羣。在HDFS Federation機制下,會有多個Namenode,所以不同Namenode直接namespaceID是不同的,分別管理一組 blockpoolID,但是整個集羣中,clusterID是唯一的,每次format namenode會生成一個新的,也可以使用-clusterid手工指定ID
> storageType: 有兩種取值NAME_NODE /DATA_NODE
> cTime:HDFS創建時間,在升級後會更新該值
二、Datanode:從
> 存儲:數據塊和數據塊校驗和
> 與NN進行通信:
1、每隔3s會發送心跳包給NN,告訴NN自己還處於Live狀態。
3s的默認時間由配置文件(hdfs-site.xml)中參數:dfs.heartbeat.interval決定.在生產環境中我們都是採用默認三秒,不對其進行修改。
2、每隔一定的時間發生一次blockreport(塊報告)
默認時間由配置文件(hdfs-site.xml)中參數:dfs.blockreport.intervalMsec決定. 默認時間爲21600000ms=6h,在生產環境中我們會對其優化爲3h。當時具體時間的設置需要根據自己業務數據量。
Datanode主要存儲數據,下面是一個標準的dfs.datanode.data.dir目錄結構
1、BP-random integer-NameNode-IP address-creation time
BP代表BlockPool的意思,就是上面Namenode的VERSION中的集羣唯一blockpoolID,如果是Federation HDFS,則該目錄下有兩個BP開頭的目錄,IP部分和時間戳代表創建該BP的NameNode的IP地址和創建時間戳2、VERSION
與Namenode類似,其中storageType是DATA_NODE
偶然的一個機會看到下面圖中的情況,感覺很有意思
如果讓你做選擇,你會選擇哪項,哈哈哈
3、finalized/rbw目錄
這兩個目錄都是用於實際存儲HDFS BLOCK的數據,裏面包含許多block_xx文件以及相應的.meta文件,.meta文件包含了checksum信息。
rbw是“replica being written”的意思,該目錄用於存儲用戶當前正在寫入的數據。
4、in_use.lock
防止一臺機器同時啓動多個Datanode進程導致目錄數據不一致
三、SecondaryName
> 存儲:fsimage+editlog
> 與NN進行通信:定期合併fsimage+editlog文件作爲新的fsimage,並推送給NN,簡稱checkpoint。
爲了解決單點故障,只有NN,後來添加了SNN角色,由於合併鏡像文件和編輯日誌也是需要有時間的(備份機制),雖然能夠減輕單點故障,但是依然還是會有風險,所以hadoop又開發了HA機制,具體原理可以參考一下鏈接:
https://blog.csdn.net/czz1141979570/article/details/86738013
Checkpoint介紹
HDFS會定期(dfs.namenode.checkpoint.period,默認3600秒)的對最近的fsimage和一批新edits文件進行Checkpoint(也可以手工命令方式),Checkpoint發生後會將前一次Checkpoint後的所有edits文件合併到新的fsimage中,HDFS會保存最近兩次checkpoint的fsimage。Namenode啓動時會把最新的fsimage加載到內存中。
下面是一個標準的dfs.namenode.name.dir目錄結構,注意edits和fsimage也可以通過配置放到不同目錄中
├── current
│ ├── VERSION
│ ├── edits_0000000000000000001-0000000000000000007
│ ├── edits_0000000000000000008-0000000000000000015
│ ├── edits_0000000000000000016-0000000000000000022
│ ├── edits_0000000000000000023-0000000000000000029
│ ├── edits_0000000000000000030-00000000000000000308
│ ├── edits_00000000000000000308-00000000000000000324
│ ├── edits_inprogress_00000000000000000325
│ ├── fsimage_0000000000000000029
│ ├── fsimage_0000000000000000029.md5
│ ├── fsimage_00000000000000000324
│ ├── fsimage_00000000000000000324.md5
│ └── seen_txid
└── in_use.lock
具體的SNN機制,請百度
1、roll edit
2、傳輸fsimage+edits
3、merger
4、傳輸fsimage.chpt to nn
5、回滾 fsimage.ckpt ==> fsimage
edit.new ==< edit
--------------------------
用人品去感動別人,用行動去帶動別人,用陽光去照耀別人,用堅持去贏得別人,要求自己每天都去做與目標有關的事情,哪怕每天只進步一點點,堅持下來你就是最優秀卓越的!歡迎大家加入大數據qq交流羣:725967421 微信羣:flyfish運維實操 一起交流,一起進步!!
--------------------------