HDFS Balancer工具可以用來分析塊的分布情況,并且可以重新分配DataNode中的數據。本文為您介紹如何使用HDFS Balancer工具,以及Balancer的主要調優參數。
背景信息
HDFS采用主從架構,其中NameNode管理文件系統的元數據(例如文件名、文件的塊信息及其位置),而實際的數據塊則存儲在多個DataNode上。這種架構允許數據冗余存儲,提高了系統的容錯能力。
隨著時間的推移,由于文件的添加、刪除和修改操作,DataNodes之間的數據分布可能會變得不均衡,某些節點的存儲空間可能接近飽和,而其他節點可能有大量的空閑空間。這種不均衡不僅影響了系統的存儲效率,還可能增加數據丟失的風險,因為過度填充的節點更易受硬件故障的影響。
為了應對這一問題,HDFS提供了Balancer工具,這是一個命令行實用程序,旨在自動重新平衡DataNodes間的數據分布。Balancer通過移動數據塊來減少各節點間的存儲不均衡,確保整個集群的存儲資源得到更有效的利用。
查看DataNode的容量和使用情況
查看DataNode的容量和使用情況,可以幫助您識別當前存儲資源的分配狀態,及時發現并解決存儲空間不足的問題,確保數據在各個節點間均衡分布,從而提升系統整體的性能和穩定性。
登錄待配置集群的主節點,詳情請參見登錄集群。
執行以下命令,查看各DataNode的容量和使用情況。
hdfs dfsadmin -report
結果顯示每個DataNode的總容量、使用量、使用率以及剩余空間的詳細信息,有助于識別存儲不均衡問題。
當發現數據分布極度不均,例如某些DataNode的存儲使用率遠高于其他節點,且差異超過默認或設定的平衡閾值(通常是10%),此時應啟動HDFS Balancer。
啟動HDFS Balancer
方式一:使用HDFS Balancer命令
HDFS Balancer命令語句如下。
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
Balancer主要參數如下表。
參數 | 描述 |
threshold | 磁盤容量的百分數。 默認值為10%,表示上下浮動10%。 當集群總使用率較高時,需要調小Threshold,避免閾值過高。 當集群新增節點較多時,您可以適當增加Threshold,使數據從高使用率節點移向低使用率節點。 |
policy | 平衡策略。支持以下策略:
|
exclude | Balancer排除特定的DataNode。 |
include | Balancer僅對特定的DataNode進行平衡操作。 |
source | 僅選擇特定的DataNode作為源節點。 |
blockpools | Balancer僅在指定的blockpools中運行。 |
idleiterations | 最多允許的空閑循環次數。覆蓋默認的5次。 |
方式二:使用start-balancer.sh工具
start-balancer.sh實際上是調用hdfs daemon start balancer命令。使用方式如下:
登錄待配置集群的任意節點,詳情請參見登錄集群。
可選:執行以下命令,修改Balancer的最大帶寬。
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>
說明<bandwidth in bytes per second>
為設置的最大帶寬。例如,如果需要設置帶寬控制為200 MB/s,對應值為200 * 1024 * 1024B,即209715200字節,則完整代碼示例為hdfs dfsadmin -setBalancerBandwidth 209715200
。為優化網絡資源利用并保障核心業務流暢,在集群高負載情形下,建議適度削減數據平衡帶寬,可以改為20971520(20 MB/s);在集群空閑時,為了加速數據均衡過程,建議將數據平衡帶寬提高,可以改為1073741824(1 GB/s)。執行以下命令,切換到hdfs用戶并執行Balancer參數。
DataLake集群
su hdfs /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5
Hadoop集群
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5
說明-threshold 5
:用于設置數據平衡的閾值。閾值被設定為5%,意味著當某個DataNode的數據存儲量與集群平均存儲量之差小于或等于5%時,平衡器認為該節點的數據分布是均衡的,不再嘗試從該節點移出或移入數據塊。不同的環境可能會根據實際情況調整這個閾值以達到理想的平衡效果。
執行以下命令,查看Balancer運行情況。
DataLake集群
tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log
Hadoop集群
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.log
說明命令中的
hadoop-hdfs-balancer-master-1-1.c-xxx.log
和hadoop-hdfs-balancer-emr-header-xx.cluster-xxx.log
為上一步驟中獲取到的日志名稱。
當提示信息包含
Successfully
字樣時,表示執行成功。
Balancer調優參數
執行Balancer會占用一定的系統資源,建議在業務空閑期執行。默認情況下,不需要對HDFS Balancer參數進行額外調整。當需要對Balancer參數進行額外調整時,您可以在E-MapReduce控制臺的HDFS服務頁面,選擇
,調整以下兩類配置。客戶端配置
參數
描述
dfs.balancer.dispatcherThreads
Balancer在移動Block之前,每次迭代時查詢出一個Block列表,分發給Mover線程使用。
說明dispatcherThreads是該分發線程的個數,默認為200。
dfs.balancer.rpc.per.sec
默認值為20,即每秒發送的RPC數量為20。
因為分發線程調用大量getBlocks的RPC查詢,所以為了避免NameNode由于分發線程壓力過大,需要控制分發線程RPC的發送速度。
例如,您可以在負載高的集群調整參數值,減小10或者5,對整體移動進度不會產生特別大的影響。
dfs.balancer.getBlocks.size
Balancer會在移動Block前,每次迭代時查詢出一個Block列表,給Mover線程使用,默認Block列表中Block的大小為2 GB。因為getBlocks過程會對RPC進行加鎖,所以您可以根據NameNode壓力進行調整。
dfs.balancer.moverThreads
默認值為1000。
Balancer處理移動Block的線程數,每個Block移動時會使用一個線程。
DataNode配置
參數
描述
dfs.datanode.balance.bandwidthPerSec
指定DataNode用于Balancer的帶寬,通常推薦設置為100 MB/s,您也可以通過dfsadmin -setBalancerBandwidth 參數進行適當調整,無需重啟DataNode。
例如,在負載低時,增加Balancer的帶寬。在負載高時,減少Balancer的帶寬。
dfs.datanode.balance.max.concurrent.moves
默認值為5。
指定DataNode節點并發移動的最大個數。通常考慮和磁盤數匹配,推薦在DataNode端設置為
4 * 磁盤數
作為上限,可以使用Balancer的值進行調節。例如:一個DataNode有28塊盤,在Balancer端設置為28,DataNode端設置為
28 * 4
。具體使用時根據集群負載適當調整。在負載較低時,增加concurrent數;在負載較高時,減少concurrent數。
常見問題
Q:為什么Balancer的threshold設置為10(%),但是平衡以后看到差值為20%左右?
A:threshold的含義是控制每個DataNode的使用率不高于或者不低于集群平均的使用率,所以使用率最多和最少的DataNode在平衡后可能差值為20%。要減少這種差距,可以嘗試把差值調節到5(%)。