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 5Hadoop叢集
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.logHadoop叢集
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(%)。