Hadoop-HDFS組件中的本地存儲目錄(NN/DN/SNN)結構剖析

    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運維實操    一起交流,一起進步!!
--------------------------
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章