Hadoop 3中的磁盤管理大招解密
1、前言
本文深入研究 HDFS 磁盤平衡的新特性,這是 Hadoop3 中加入的一個(gè)特性。
HDFS 現(xiàn)在包括(在 CDH 5. 8. 2 和更高版本中發(fā)布)用于跨節(jié)點(diǎn)移動(dòng)數(shù)據(jù)的全面的存儲(chǔ)容量管理方法。
在 HDFS 中,DataNode 將數(shù)據(jù)塊分散到本地文件系統(tǒng)目錄中,這可以使用 hdfs-site.xml 文件的 dfs.datanode.data.dir 參數(shù)指定。
在典型的安裝中,每個(gè)目錄(在 HDFS 術(shù)語(yǔ)中稱為卷)位于不同的設(shè)備上(例如,在單獨(dú)的 HDD 和 SSD 上)。
當(dāng)向 HDFS 寫入新塊時(shí),DataNode 使用卷選擇策略為塊選擇磁盤。
當(dāng)前支持兩種此類策略類型:
- 輪詢(round-robin)
- 可用空間(available space)(HDFS-1804)
簡(jiǎn)而言之,如圖1所示,輪詢策略在可用磁盤上均勻分布新塊,而可用空間策略優(yōu)先將數(shù)據(jù)寫入具有***可用空間(按百分比)的磁盤。
圖1
默認(rèn)情況下,DataNode 使用基于輪詢的策略寫入新塊。但是,在長(zhǎng)期運(yùn)行的集群中,由于 HDFS 中大規(guī)模文件刪除或通過(guò)磁盤熱交換特性添加新 DataNode 磁盤等事件,DataNode 仍然可能創(chuàng)建了顯著不平衡的卷。
即使您使用基于可用空間的卷選擇策略,卷不平衡仍然可能導(dǎo)致效率較低的磁盤 I / O。
例如:每個(gè)新寫入將轉(zhuǎn)到新添加的空磁盤,而其他磁盤在此期間是空閑的,這會(huì)在新磁盤造成瓶頸。
最近,Apache Hadoop 社區(qū)開(kāi)發(fā)了服務(wù)器離線腳本(在 HDFS-1312,dev@ mailing list 和 GitHub 中所討論的),以緩解數(shù)據(jù)不平衡問(wèn)題。
但是,由于處于 HDFS 代碼庫(kù)之外,這些腳本要求 DataNode 在磁盤之間移動(dòng)數(shù)據(jù)之前脫機(jī)。
因此,HDFS-1312 還引入了一種在線磁盤平衡器,旨在根據(jù)各種指標(biāo)重新平衡正在運(yùn)行的 DataNode 上的卷。
與 HDFS 平衡器類似,HDFS 磁盤平衡器作為 DataNode 中的線程運(yùn)行,以便在具有相同存儲(chǔ)類型的卷之間移動(dòng)塊文件。
在本文的剩余部分,您將了解為什么以及如何使用此新特性。
2、如何使用磁盤平衡器?
讓我們通過(guò)一個(gè)例子逐步探討這個(gè)有用的特性。
首先,確認(rèn)在所有 DataNode 上配置 dfs.disk.balancer.enabled 設(shè)置為 true。
從 CDH 5.8.2 起,用戶可以通過(guò) Cloudera Manager 中的 HDFS 安全閥片段指定此配置:
在此示例中,我們將向預(yù)加載的 HDFS DataNode 添加一個(gè)新磁盤(/mnt/disk1),并將新磁盤掛載到 /mnt/disk2。
在 CDH 中,每個(gè) HDFS 數(shù)據(jù)目錄位于單獨(dú)的磁盤上,因此可以使用 df 顯示磁盤使用情況:
顯然,是時(shí)候讓磁盤平衡了!
典型的磁盤平衡器任務(wù)涉及三個(gè)步驟(通過(guò) HDFS diskbalancer 命令實(shí)現(xiàn)):計(jì)劃,執(zhí)行和查詢。
在***步中,HDFS 客戶端從 NameNode 讀取關(guān)于指定的 DataNode 的必要信息,以生成執(zhí)行計(jì)劃:
從輸出中可以看出,HDFS 磁盤平衡器使用計(jì)劃器來(lái)計(jì)算指定 DataNode 上數(shù)據(jù)移動(dòng)計(jì)劃的步驟,這是通過(guò)使用 DataNode 向 NameNode 報(bào)告的磁盤使用信息來(lái)完成的。
每個(gè)步驟指定要移動(dòng)數(shù)據(jù)的源卷和目標(biāo)卷,以及預(yù)計(jì)移動(dòng)的數(shù)據(jù)量。
在編寫本文時(shí),HDFS 支持的唯一計(jì)劃器是 GreedyPlanner ,它不斷將數(shù)據(jù)從最常用的設(shè)備移動(dòng)到最少使用的設(shè)備,直到全部數(shù)據(jù)均勻分布在所有設(shè)備上。
用戶還可以在計(jì)劃命令中指定空間利用率的閾值;因此,如果空間利用率的差異低于閾值,則計(jì)劃器認(rèn)為磁盤是平衡的。
另一個(gè)值得注意的選項(xiàng)是通過(guò)在計(jì)劃過(guò)程中指定— bandwidth 來(lái)限制磁盤平衡器任務(wù) I/O,以便磁盤平衡器 I/O 不會(huì)影響前臺(tái)工作。
磁盤平衡器執(zhí)行計(jì)劃生成為存儲(chǔ)在 HDFS 中的 JSON 文件。
默認(rèn)情況下,計(jì)劃文件保存在 /system/diskbalancer 目錄下:
要在 DataNode 上執(zhí)行計(jì)劃,請(qǐng)運(yùn)行:
此命令將 JSON 計(jì)劃文件提交給 DataNode,DataNode 在后臺(tái) BlockMover 線程中執(zhí)行它。
檢查 DataNode 上磁盤平衡器任務(wù)的狀態(tài),請(qǐng)使用 query 命令:
輸出(PLAN_DONE)表示磁盤平衡任務(wù)已完成。要驗(yàn)證磁盤平衡器的有效性,請(qǐng)?jiān)俅问褂?df -h 查看跨兩個(gè)本地磁盤的數(shù)據(jù)分布:
輸出確認(rèn)磁盤平衡器成功地將卷之間的磁盤空間使用率差異降低到10%以下。任務(wù)完成!
要閱讀有關(guān) HDFS 磁盤均衡器的更多詳細(xì)信息,請(qǐng)閱讀 Cloudera 文檔和上游文檔。
3、總結(jié)
隨著 HDFS-1312 中引入期待已久的內(nèi)部 DataNode 磁盤平衡器特性,CDH 5.8.2 及更高版本中帶來(lái)的 HDFS 版本提供了一個(gè)全面的存儲(chǔ)容量管理解決方案,可以實(shí)現(xiàn)以下3種數(shù)據(jù)移動(dòng):跨節(jié)點(diǎn)(平衡器)、存儲(chǔ)類型(Mover)和單個(gè) DataNode 中的磁盤(磁盤平衡器)。