原文地址: https://itweknow.cn/detail?id=69 ,歡迎大家訪問杨刨。
為了后面能夠更加熟悉的保障Hadoop集群的平穩(wěn)運行晤柄,我們需要深入的了解NameNode、SecondaryNameNode(也稱輔助NameNode)以及datanode等HDFS組件在磁盤上的目錄結(jié)構(gòu)以及運行的原理妖胀。這篇文章我們就一起來看一下NameNode的目錄結(jié)構(gòu)芥颈。
namenode的目錄結(jié)構(gòu)一覽
NameNode的工作目錄就是我門指定的hadoop工作目錄(由hadoop.tmp.dir配置項指定,配置在core-site.xml文件內(nèi))下的dfs/name目錄赚抡。
root@test:~/hadoop/tmp/dfs# tree name
name
├── current
│ ├── edits_0000000000000000001-0000000000000000002
│ ├── edits_0000000000000000003-0000000000000000003
│ ├── edits_0000000000000000004-0000000000000000005
│ ├── edits_0000000000000000006-0000000000000000006
│ ├── edits_0000000000000000007-0000000000000000008
│ ├── edits_0000000000000000009-0000000000000000010
│ ├── edits_0000000000000000011-0000000000000000012
│ ├── edits_0000000000000000013-0000000000000000014
│ ├── edits_0000000000000000015-0000000000000000016
│ ├── edits_0000000000000000017-0000000000000000018
│ ├── edits_0000000000000000019-0000000000000000020
│ ├── edits_inprogress_0000000000000000021
│ ├── fsimage_0000000000000000000
│ ├── fsimage_0000000000000000000.md5
│ ├── fsimage_0000000000000000020
│ ├── fsimage_0000000000000000020.md5
│ ├── seen_txid
│ └── VERSION
└── in_use.lock
- edits_0000xxxx -> 編輯日志文件
- edits_inprogress_000xxx -> 當前打開可寫的編輯日志
- fsimage_000xxx -> 文件系統(tǒng)鏡像文件
- VERSION -> HDFS版本信息的描述文件
- in_use.lock -> 一個鎖文件爬坑,namenode使用該文件為存儲目錄枷鎖,避免其它namenode實例同時使用同一個存儲目錄的情況涂臣。
VERSION
VERSION
文件中包含正在運行的HDFS的版本信息盾计,一般情況下應(yīng)該包含下面的內(nèi)容:
#Wed Jan 02 07:08:58 UTC 2019
namespaceID=1447158958
clusterID=CID-67c5cf48-73da-4469-9c90-2759b2e0481c
cTime=1544608355749
storageType=NAME_NODE
blockpoolID=BP-1627059714-192.168.142.9-1544608355749
layoutVersion=-63
-
layoutVersion
是一個負整數(shù),描述HDFS持久性數(shù)據(jù)結(jié)構(gòu)(也稱之為布局)的版本赁遗,但是這個與Hadoop發(fā)布包的版本號無關(guān)署辉。 -
namespaceID
是文件系統(tǒng)命名空間的唯一標識,是在namenode首次格式化的時候創(chuàng)建的岩四。 -
clusterID
是將HDFS集群作為一個整體賦予的唯一標識符哭尝,對于聯(lián)邦HDFS分廠中藥,因為在聯(lián)邦HDFS機制下一個集群由多個命名空間組成炫乓,每個命名空間由一個namenode管理。 -
blockpoolID
是數(shù)據(jù)塊池的唯一標識符献丑,數(shù)據(jù)塊池中包含了由一個namenode管理的命名空間中的所有文件 -
cTime
屬性標記了namenode存儲系統(tǒng)的創(chuàng)建時間末捣。對于剛剛格式化的文件系統(tǒng)這個屬性值為0,在文件系統(tǒng)升級之后這個值就會更新到新的時間戳创橄。 -
storageType
說明該存儲目錄包含的是namenode的數(shù)據(jù)結(jié)構(gòu)箩做。
編輯日志和文件系統(tǒng)鏡像
- 編輯日志
當我們操作HDFS中的文件時,這些操作首先會被寫入到編輯日志中妥畏,然后相關(guān)的文件數(shù)據(jù)也會被更新邦邦。編輯日志文件在概念上是單個實體安吁,但是它其實是存儲在磁盤上的多個文件上的,我們看到了很多的edits_000xxx就是編輯日志燃辖。但是任何一個時刻都只有一個編輯日志文件處于打開可寫的狀態(tài)(edits_inprogress_000xxx)鬼店。
其實這個有點類似日志滾動的概念。
文件系統(tǒng)鏡像
每個fsimage_000xxx文件都是HDFS文件系統(tǒng)的一個鏡像(也稱之為文件系統(tǒng)元數(shù)據(jù)的一個完整的永久性檢查點)黔龟,鏡像文件的大小一般都比較大妇智,我們對HDFS中文件的操作并不會直接記錄到鏡像文件中,而是寫入到編輯日志中氏身,在namenode啟動的時候會首先載入最近的一個鏡像文件巍棱,然后再讀取編輯日志中的改變,這樣我們就可以將namenode恢復到上一次正常工作時的狀態(tài)了蛋欣。編輯日志合并到文件系統(tǒng)鏡像
編輯日志不會是無限的增長的航徙,集群中的SecondaryNameNode會定期為namenode內(nèi)存中的文件系統(tǒng)元數(shù)據(jù)創(chuàng)建系統(tǒng)鏡像,具體的創(chuàng)建過程參照下圖陷虎。
- SecondaryNameNode請求NameNode停止使用當前打開的edits文件(即edits_inprogress_000xxx文件)到踏,并重新打開一個新的編輯日志文件以記錄新的操作。
- SecondaryNameNode從NameNode中獲取最近的fsimage和edits文件泻红,使用HTTP GET方式獲取夭禽。
- SecondaryNameNode將fsimage載入內(nèi)存,然后逐一執(zhí)行edits文件中記錄的操作谊路,然后創(chuàng)建一個新的鏡像文件讹躯。
- SecondaryNameNode將合并后的鏡像文件發(fā)送到NameNode(HTTP PUT),NameNode將其保存為一個臨時文件。
- NameNode重新命名該臨時的鏡像文件缠劝,此為最新的鏡像文件潮梯。
edits日志文件合并的觸發(fā)條件受兩個配置項的控制,dfs.namenode.checkpoint.period(單位為秒)惨恭,這個配置項是從時間維度上的控制秉馏,默認情況下是每隔1個小時觸發(fā)一次合并。
第二個配置項是dfs.namenode.checkpoint.txns脱羡,這個配置是從編輯日志大大小維度上進行控制的萝究,默認是如果從上一個檢查點開始編輯日志已經(jīng)達到了100萬個事務(wù)就合并。檢查編輯日志大小的頻率默認是1分鐘檢查一次锉罐,可由dfs.namenode.checkpoint.check.period(單位為秒)配置項來改變帆竹。