目錄
NameNode
學(xué)習(xí)目標(biāo)
理解 namenode 的工作機(jī)制尤其是元數(shù)據(jù)管理機(jī)制,以增強(qiáng)對 HDFS 工作原理的 理解,及培養(yǎng) hadoop 集群運(yùn)營中“性能調(diào)優(yōu)”、“namenode”故障問題的分析解決能力
問題場景
1、Namenode 服務(wù)器的磁盤故障導(dǎo)致 namenode 宕機(jī),如何挽救集群及數(shù)據(jù)?
2、Namenode 是否可以有多個?namenode 內(nèi)存要配置多大?namenode 跟集群數(shù)據(jù)存儲能 力有關(guān)系嗎?
3、文件的 blocksize 究竟調(diào)大好還是調(diào)小好?結(jié)合 mapreduce
NameNode的職責(zé)
1、負(fù)責(zé)客戶端請求(讀寫數(shù)據(jù) 請求 )的響應(yīng) 2、維護(hù)目錄樹結(jié)構(gòu)( 元數(shù)據(jù)的管理: 查詢,修改 ) 3、配置和應(yīng)用副本存放策略 4、管理集群數(shù)據(jù)塊負(fù)載均衡問題
NameNode元數(shù)據(jù)的管理
WAL(Write ahead Log): 預(yù)寫日志系統(tǒng)
在計(jì)算機(jī)科學(xué)中,預(yù)寫式日志(Write-ahead logging,縮寫 WAL)是關(guān)系數(shù)據(jù)庫系統(tǒng)中 用于提供原子性和持久性(ACID 屬性中的兩個)的一系列技術(shù)。在使用 WAL 的系統(tǒng)中,所 有的修改在提交之前都要先寫入 log 文件中。
Log 文件中通常包括 redo 和 undo 信息。這樣做的目的可以通過一個例子來說明。假設(shè) 一個程序在執(zhí)行某些操作的過程中機(jī)器掉電了。在重新啟動時,程序可能需要知道當(dāng)時執(zhí)行 的操作是成功了還是部分成功或者是失敗了。如果使用了 WAL,程序就可以檢查 log 文件, 并對突然掉電時計(jì)劃執(zhí)行的操作內(nèi)容跟實(shí)際上執(zhí)行的操作內(nèi)容進(jìn)行比較。在這個比較的基礎(chǔ) 上,程序就可以決定是撤銷已做的操作還是繼續(xù)完成已做的操作,或者是保持原樣。
WAL 允許用 in-place 方式更新數(shù)據(jù)庫。另一種用來實(shí)現(xiàn)原子更新的方法是 shadow paging, 它并不是 in-place 方式。用 in-place 方式做更新的主要優(yōu)點(diǎn)是減少索引和塊列表的修改。ARIES 是 WAL 系列技術(shù)常用的算法。在文件系統(tǒng)中,WAL 通常稱為 journaling。PostgreSQL 也是用 WAL 來提供 point-in-time 恢復(fù)和數(shù)據(jù)庫復(fù)制特性。
NameNode 對數(shù)據(jù)的管理采用了兩種存儲形式:內(nèi)存和磁盤
首先是內(nèi)存中存儲了一份完整的元數(shù)據(jù),包括目錄樹結(jié)構(gòu),以及文件和數(shù)據(jù)塊和副本存儲地 的映射關(guān)系;
1、內(nèi)存元數(shù)據(jù) metadata(全部存在內(nèi)存中),其次是在磁盤中也存儲了一份完整的元數(shù)據(jù)。
2、磁盤元數(shù)據(jù)鏡像文件 fsimage_0000000000000000555
fsimage_0000000000000000555 等價于
edits_0000000000000000001-0000000000000000018
……
edits_0000000000000000444-0000000000000000555
合并之和
3、數(shù)據(jù)歷史操作日志文件 edits:edits_0000000000000000001-0000000000000000018 (可通過日志運(yùn)算出元數(shù)據(jù),全部存在磁盤中)
4、數(shù)據(jù)預(yù)寫操作日志文件 edits_inprogress_0000000000000000556 (存儲在磁盤中)
metadata = 最新 fsimage_0000000000000000555 + edits_inprogress_0000000000000000556
metadata = 所有的 edits 之和(edits_001_002 + …… + edits_444_555 + edits_inprogress_556)
VERSION(存放 hdfs 集群的版本信息)文件解析:
#Sun Jan 06 20:12:30 CST 2017 ## 集群啟動時間
namespaceID=844434736 ## 文件系統(tǒng)唯一標(biāo)識符
clusterID=CID-5b7b7321-e43f-456e-bf41-18e77c5e5a40 ## 集群唯一標(biāo)識符
cTime=0 ## fsimage 創(chuàng)建的時間,初始為 0,隨 layoutVersion 更新
storageType=NAME_NODE ##節(jié)點(diǎn)類型
blockpoolID=BP-265332847-192.168.123.202-1483581570658 ## 數(shù)據(jù)塊池 ID,可以有多個
layoutVersion=-60 ## hdfs 持久化數(shù)據(jù)結(jié)構(gòu)的版本號
查看 edits 文件信息:
hdfs oev -i edits_0000000000000000482-0000000000000000483 -o edits.xml
cat edits.xml

查看 fsimage 鏡像文件信息:
hdfs oiv -i fsimage_0000000000000000348 -p XML -o fsimage.xml
cat fsimage.xml

NameNode 元數(shù)據(jù)存儲機(jī)制
A、內(nèi)存中有一份完整的元數(shù)據(jù)(內(nèi)存 metadata)
B、磁盤有一個“準(zhǔn)完整”的元數(shù)據(jù)鏡像(fsimage)文件(在 namenode 的工作目錄中)
C、用于銜接內(nèi)存 metadata 和持久化元數(shù)據(jù)鏡像 fsimage 之間的操作日志(edits 文件)
(PS:當(dāng)客戶端對 hdfs 中的文件進(jìn)行新增或者修改操作,操作記錄首先被記入 edits 日志 文件中,當(dāng)客戶端操作成功后,相應(yīng)的元數(shù)據(jù)會更新到內(nèi)存 metadata 中)
DataNode
問題場景
1、集群容量不夠,怎么擴(kuò)容?
2、如果有一些 datanode 宕機(jī),該怎么辦?
3、datanode 明明已啟動,但是集群中的可用 datanode 列表中就是沒有,怎么辦?
Datanode 工作職責(zé)
1、存儲管理用戶的文件塊數(shù)據(jù)
2、定期向 namenode 匯報(bào)自身所持有的 block 信息(通過心跳信息上報(bào))
(PS:這點(diǎn)很重要,因?yàn)?,?dāng)集群中發(fā)生某些 block 副本失效時,集群如何恢復(fù) block 初始 副本數(shù)量的問題)
<property>
<!—HDFS 集群數(shù)據(jù)冗余塊的自動刪除時長,單位 ms,默認(rèn)一個小時 -->
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
Datanode 掉線判斷時限參數(shù)
datanode 進(jìn)程死亡或者網(wǎng)絡(luò)故障造成 datanode 無法與 namenode 通信,namenode 不會立即 把該節(jié)點(diǎn)判定為死亡,要經(jīng)過一段時間,這段時間暫稱作超時時長。HDFS 默認(rèn)的超時時長 為 10 分鐘+30 秒。如果定義超時時間為 timeout,則超時時長的計(jì)算公式為: t
imeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval
而默認(rèn)的 heartbeat.recheck.interval 大小為 5 分鐘,dfs.heartbeat.interval 默認(rèn)為 3 秒。 需要注意的是 hdfs-site.xml 配置文件中的 heartbeat.recheck.interval 的單位為毫秒, dfs.heartbeat.interval 的單位為秒。 所以,舉個例子,如果 heartbeat.recheck.interval 設(shè)置為 5000(毫秒),dfs.heartbeat.interval 設(shè)置為 3(秒,默認(rèn)),則總的超時時間為 40 秒。
<property>
<name>heartbeat.recheck.interval</name>
<value>5000</value>
</property>
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
SecondaryNameNode
SecondaryNamenode 工作機(jī)制
SecondaryNamenode 的作用就是分擔(dān) namenode 的合并元數(shù)據(jù)的壓力。所以在配置 SecondaryNamenode 的工作節(jié)點(diǎn)時,一定切記,不要和 namenode 處于同一節(jié)點(diǎn)。但事實(shí)上, 只有在普通的偽分布式集群和分布式集群中才有會 SecondaryNamenode 這個角色,在 HA 或 者聯(lián)邦集群中都不再出現(xiàn)該角色。在 HA 和聯(lián)邦集群中,都是有 standby namenode 承擔(dān)。
元數(shù)據(jù)的 CheckPoint
每隔一段時間,會由 secondary namenode 將 namenode 上積累的所有 edits 和一個最新的 fsimage 下載到本地,并加載到內(nèi)存進(jìn)行 merge(這個過程稱為 checkpoint) CheckPoint 詳細(xì)過程圖解:

CheckPoint 觸發(fā)配置
dfs.namenode.checkpoint.check.period=60 ##檢查觸發(fā)條件是否滿足的頻率,60 秒
dfs.namenode.checkpoint.dir=file://${hadoop.tmp.dir}/dfs/namesecondary
##以上兩個參數(shù)做 checkpoint 操作時,secondary namenode 的本地工作目錄
dfs.namenode.checkpoint.edits.dir=${dfs.namenode.checkpoint.dir}
dfs.namenode.checkpoint.max-retries=3 ##最大重試次數(shù)
dfs.namenode.checkpoint.period=3600 ##兩次 checkpoint 之間的時間間隔 3600 秒
dfs.namenode.checkpoint.txns=1000000 ##兩次 checkpoint 之間最大的操作記錄
CheckPoint 附帶作用
Namenode 和 SecondaryNamenode 的工作目錄存儲結(jié)構(gòu)完全相同,所以,當(dāng) Namenode 故障 退出需要重新恢復(fù)時,可以從SecondaryNamenode的工作目錄中將fsimage拷貝到Namenode 的工作目錄,以恢復(fù) namenode 的元數(shù)據(jù)
|