HDFS Namenode裡的元數據

之前我寫了一篇《 》,本文將解釋一下這個集群下Namenode節點裡的元數據。下一篇講Datanode裡的元數據。

通過下面的命令進入到namenode的容器裡:

<code>$ docker exec -it namenode bash/<code>

hadoop/dfs/name 目錄

<code>root@05f1f3fc4dd6:/# cd hadoop/dfs/name//<code>

in_use.lock

name 目錄下面有一個in_use.lock文件和一個current目錄。

<code>root@05f1f3fc4dd6:/hadoop/dfs/name# ls -al
total 16
drwxr-xr-x 3 root root 4096 Mar 22 07:34 .
drwxr-xr-x 3 root root 4096 Feb 4 16:28 ..
drwx------ 2 root root 4096 Mar 22 07:46 current
-rw-r--r-- 1 root root 16 Mar 22 07:46 in_use.lock/<code>

  • in_use.lock – 這是NameNode進程持有的鎖文件,用於防止多個NameNode進程啟動並同時修改這個name目錄。
  • current 目錄

    <code>root@05f1f3fc4dd6:/hadoop/dfs/name/current# ls -al
    total 5144
    drwx------ 2 root root 4096 Mar 22 07:46 .
    drwxr-xr-x 3 root root 4096 Mar 22 07:34 ..
    -rw-r--r-- 1 root root 213 Mar 22 07:34 VERSION
    -rw-r--r-- 1 root root 1048576 Mar 22 07:34 edits_0000000000000000001-0000000000000000001
    -rw-r--r-- 1 root root 1048576 Mar 22 07:38 edits_0000000000000000002-0000000000000000038
    -rw-r--r-- 1 root root 1048576 Mar 22 07:41 edits_0000000000000000039-0000000000000000059
    -rw-r--r-- 1 root root 1048576 Mar 22 07:42 edits_0000000000000000060-0000000000000000080
    -rw-r--r-- 1 root root 1048576 Mar 23 07:46 edits_inprogress_0000000000000000081
    -rw-r--r-- 1 root root 399 Mar 22 07:34 fsimage_0000000000000000000
    -rw-r--r-- 1 root root 62 Mar 22 07:34 fsimage_0000000000000000000.md5
    -rw-r--r-- 1 root root 3 Mar 22 07:46 seen_txid/<code>

    VERSION 文件

    <code>root@05f1f3fc4dd6:/hadoop/dfs/name/current# cat VERSION
    #Sun Mar 22 07:34:46 UTC 2020
    namespaceID=893392144
    clusterID=CID-566c43dd-60f2-41e0-8aa7-25e00a93eec0
    cTime=1584862486341
    storageType=NAME_NODE
    blockpoolID=BP-689076896-172.20.0.2-1584862486341
    layoutVersion=-65/<code>
    • layoutVersion - HDFS元數據格式的版本。當我們添加需要更改元數據格式的新功能時,我們將更改此數字。當HDFS軟件使用的佈局版本比此處當前跟蹤的版本新時,需要升級HDFS。
    • namespaceID / clusterID / blockpoolID - 這些是HDFS集群的唯一標識符。標識符用於防止DataNode意外註冊到屬於其他群集的不正確的NameNode。這些標識符在聯合部署中也特別重要。在聯合部署中,有多個NameNode獨立工作。每個NameNode服務於名稱空間(namespaceID),並管理唯一的塊集(blockpoolID)。clusterID將整個群集聯繫在一起成為單個邏輯單元。在集群中的所有節點上都是相同的。
    • storageType - 存儲類型,NAME_NODE或JOURNALAL_NODE。
    • cTime - 文件系統狀態的創建時間。HDFS升級的時候將更新此字段。

    文件系統鏡像文件 fsimage

    fsimage_ – 其中包含完整的元數據鏡像。每個fsimage文件還具有一個對應的.md5文件,其中包含MD5校驗,HDFS使用該校驗來防止磁盤損壞。

    編輯日誌edit log,記錄了在最近的fsimage之後進行的每個文件系統更改(文件創建,刪除或修改)。

    edits_<start>_/<start> – 這些是不可修改的 edit log。每個edit log文件都包含文件名上的transaction ID範圍內的所有編輯日誌。在高可用性部署中,備用節點只能讀取這些edit log。

    edits_inprogress_<start> – 這是當前正在進行的編輯日誌。從<start>開始的所有變更都記錄在此文件中。HDFS以1 MB的塊大小在該文件中預先分配了空間,以提高效率。您可能會看到此文件的大小為1 MB的倍數。HDFS結束這個edit log的時候,會釋放未使用空間,因此最終文件的大小將縮小。

    seen_txid

  • seen_txid - 它包含最後一個檢查點(checkpoint,合併edits到fsimage中)的最後一個事務ID或編輯日誌滾動roll(將當前edits_inprogress關閉生成完整的的edit log文件,並創建一個新的edits_inprogress)。請注意,這並不是NameNode接受的最後一個事務ID。該文件不會在每個事務來的時候更新,而只會在檢查點checkpoint或編輯日誌滾動roll的時候更新。該文件的目的是嘗試識別啟動期間是否缺少編輯edit。可以將NameNode配置為對fsimage和edits使用單獨的目錄。如果edits目錄被意外刪除,則自上一個檢查點checkpoint以來的所有事務都將消失,NameNode有可能使用較老的fsimage啟動。為了防止這種情況,NameNode啟動時檢查seen_txid以驗證它至少要加載超過seen_txid的事物。如果無法做到,它將中止啟動。

  • 本人將持續編寫分佈式系統設計相關的技術文章和視頻,歡迎關注和討論。


    分享到:


    相關文章: