背景
相比較于個人PC,服務器一般可以通過掛載多塊磁盤來擴大單機的存儲能力。
服務器和磁盤
在Hadoop HDFS中,DataNode負責最終數(shù)據(jù)block的存儲,在所在機器上的磁盤之間分配數(shù)據(jù)塊。當寫入新block時,DataNodes將根據(jù)選擇策略(循環(huán)策略或可用空間策略)來選擇block的磁盤(卷)。
循環(huán)策略:它將新block均勻分布在可用磁盤上。默認此策略。
可用空間策略:此策略將數(shù)據(jù)寫入具有更多可用空間(按百分比)的磁盤。
服務器磁盤使用情況
但是,在長期運行的群集中采用循環(huán)策略時,DataNode有時會不均勻地填充其存儲目錄(磁盤/卷),從而導致某些磁盤已滿而其他磁盤卻很少使用的情況。發(fā)生這種情況的原因可能是由于大量的寫入和刪除操作,也可能是由于更換了磁盤。
另外,如果我們使用基于可用空間的選擇策略,則每個新寫入將進入新添加的空磁盤,從而使該期間的其他磁盤處于空閑狀態(tài)。這將在新磁盤上創(chuàng)建瓶頸。
因此,需要一種Intra DataNode Balancing(DataNode內數(shù)據(jù)塊的均勻分布)來解決Intra-DataNode偏斜(磁盤上塊的不均勻分布),這種偏斜是由于磁盤更換或隨機寫入和刪除而發(fā)生的。
因此,Hadoop 3.0中引入了一個名為Disk Balancer的工具,該工具專注于在DataNode內分發(fā)數(shù)據(jù)。
HDFS Disk Balancer簡介
HDFS disk balancer是Hadoop 3中引入的命令行工具,用于平衡DataNode中的數(shù)據(jù)在磁盤之間分布不均勻問題。 這里要特別注意,HDFS disk balancer與HDFS Balancer是不同的:
HDFS disk balancer針對給定的DataNode進行操作,并將塊從一個磁盤移動到另一個磁盤,是DataNode內部數(shù)據(jù)在不同磁盤間平衡;
HDFS Balancer平衡了DataNode節(jié)點之間的分布。
HDFS Disk Balancer功能
HDFS Disk balancer支持兩個主要功能,即報告和平衡。
數(shù)據(jù)傳播報告
為了定義一種方法來衡量集群中哪些計算機遭受數(shù)據(jù)分布不均的影響,HDFS磁盤平衡器定義了HDFS Volume Data Density metric(卷/磁盤數(shù)據(jù)密度度量標準)和Node Data Density metric(節(jié)點數(shù)據(jù)密度度量標準)。
HDFS卷數(shù)據(jù)密度度量標準能夠比較數(shù)據(jù)在給定節(jié)點的不同卷上的分布情況。
節(jié)點數(shù)據(jù)密度度量允許在節(jié)點之間進行比較。
- Volume data density metric計算過程
假設有一臺具有四個卷/磁盤的計算機-Disk1,Disk2,Disk3,Disk4,各個磁盤使用情況:
|
Disk1 |
Disk2 |
Disk3 |
Disk4 |
capacity |
200 GB |
300 GB |
350 GB |
500 GB |
dfsUsed |
100 GB |
76 GB |
300 GB |
475 GB |
dfsUsedRatio |
0.5 |
0.25 |
0.85 |
0.95 |
volumeDataDensity |
0.20 |
0.45 |
-0.15 |
-0.24 |
Total capacity= 200 + 300 + 350 + 500 = 1350 GB
Total Used= 100 + 76 + 300 + 475 = 951 GB
因此,每個卷/磁盤上的理想存儲為:
Ideal storage = total Used ÷ total capacity= 951÷1350 = 0.70
也就是每個磁盤應該保持在 70%理想存儲容量。
VolumeDataDensity = idealStorage – dfs Used Ratio
比如Disk1的卷數(shù)據(jù)密度= 0.70-0.50 = 0.20。其他Disk以此類推。
volumeDataDensity的正值表示磁盤未充分利用,而負值表示磁盤相對于當前理想存儲目標的利用率過高。
- Node Data Density計算過程
Node Data Density(節(jié)點數(shù)據(jù)密度)= 該節(jié)點上所有卷/磁盤volume data density絕對值的總和。
上述例子中的節(jié)點數(shù)據(jù)密度=|0.20|+|0.45|+|-0.15|+|-0.24| =1.04
較低的node Data Density值表示該機器節(jié)點具有較好的擴展性,而較高的值表示節(jié)點具有更傾斜的數(shù)據(jù)分布。
一旦有了volumeDataDensity和nodeDataDensity,就可以找到集群中數(shù)據(jù)分布傾斜的節(jié)點,或者可以獲取給定節(jié)點的volumeDataDensity。
磁盤平衡
當指定某個DataNode節(jié)點進行disk數(shù)據(jù)平衡,就可以先計算或讀取當前的volumeDataDensity(磁盤數(shù)據(jù)密度)。有了這些信息,我們可以輕松地確定哪些卷已超量配置,哪些卷已不足。為了將數(shù)據(jù)從一個卷移動到DataNode中的另一個卷,Hadoop開發(fā)實現(xiàn)了基于RPC協(xié)議的Disk Balancer。
HDFS Disk Balancer開啟
HDFS Disk Balancer通過創(chuàng)建計劃進行操作,該計劃是一組語句,描述應在兩個磁盤之間移動多少數(shù)據(jù),然后在DataNode上執(zhí)行該組語句。計劃包含多個移動步驟。計劃中的每個移動步驟都具有目標磁盤,源磁盤的地址。移動步驟還具有要移動的字節(jié)數(shù)。該計劃是針對可操作的DataNode執(zhí)行的。
默認情況下,Hadoop群集上已經(jīng)啟用了Disk Balancer功能。通過在hdfs-site.xml中調整dfs.disk.balancer.enabled參數(shù)值,選擇在Hadoop中是否啟用磁盤平衡器。
HDFS Disk Balancer相關命令
Plan計劃
命令:hdfs diskbalancer -plan <datanode>
-out //控制計劃文件的輸出位置
-bandwidth //設置用于運行Disk Balancer的最大帶寬。默認帶寬10 MB/s。
–thresholdPercentage //定義磁盤開始參與數(shù)據(jù)重新分配或平衡操作的值。默認的thresholdPercentage值為10%,這意味著僅當磁盤包含的數(shù)據(jù)比理想存儲值多10%或更少時,磁盤才用于平衡操作。
-maxerror //它允許用戶在中止移動步驟之前為兩個磁盤之間的移動操作指定要忽略的錯誤數(shù)。
-v //詳細模式,指定此選項將強制plan命令在stdout上顯示計劃的摘要。
-fs //此選項指定要使用的NameNode。如果未指定,則Disk Balancer將使用配置中的默認NameNode。
命令
Execute執(zhí)行
命令:hdfs diskbalancer -execute <JSON file path>
execute命令針對為其生成計劃的DataNode執(zhí)行計劃。
Query查詢
命令:hdfs diskbalancer -query <datanode>
query命令從運行計劃的DataNode獲取HDFS磁盤平衡器的當前狀態(tài)。
Cancel取消
命令:hdfs diskbalancer -cancel <JSON file path>
hdfs diskbalancer -cancel planID node <nodename>
cancel命令取消運行計劃。
Report匯報
命令:hdfs diskbalancer -fs https://namenode.uri -report <file://>