描述:今天早上到公司,發現測試集羣中的一臺機器的磁盤使用率100%,而其餘節點的磁盤使用率只有30%左右,檢查磁盤的使用狀況後,使用率飽滿的機器上,90%的數據都是/dfs目錄下的,由於只是昨天項目測試剛跑進來的數據,刪是不可能的,因此只能想辦法對集羣中的數據進行平衡。html
引發這種狀況的方式不少:node
1. 添加新的Datanode節點網絡
2. 人爲干預將數據的副本數下降或者增長併發
咱們都知道當HDFS出現數據不平衡的時候,就會形成MapReduce或Spark等應用程序沒法很好的利用本地計算的優點,並且Datanode節點之間也沒有更好的網絡帶寬利用率,某些Datanode節點的磁盤沒法使用等等問題。app
在Hadoop中,提供了hdfs balancer程序用來保證HDFS的數據平衡,咱們先看一下這個程序的參數:負載均衡
hdfs balancer --helpide
Usage: hdfs balanceroop
[-policy ] the balancing policy: datanode or blockpool測試
[-threshold ] Percentage of disk capacitythis
[-exclude [-f | ]] Excludes the specified datanodes.
[-include [-f | ]] Includes only the specified datanodes.
[-idleiterations ] Number of consecutive idle iterations (-1 for Infinite) before exit.
[-runDuringUpgrade] Whether to run the balancer during an ongoing HDFS upgrade.This is usually not desired since it will not affect used space on over-utilized machines.
Generic options supported are
-conf specify an application configuration file
-D use value for given property
-fs specify a namenode
-jt specify a ResourceManager
-files specify comma separated files to be copied to the map reduce cluster
-libjars specify comma separated jar files to include in the classpath.
-archives specify comma separated archives to be unarchived on the compute machines.
The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]
選項的含義根據描述應該很好理解,其中-threshold參數是用來判斷數據平衡的依據,值範圍爲0-100。默認值爲10,表示HDFS達到平衡狀態的磁盤使用率誤差值爲10%,若是機器與機器之間磁盤使用率誤差小於10%,那麼咱們就認爲HDFS集羣已經達到了平衡的狀態。
咱們能夠從CDH平臺的CM上看到該參數是默認值和含義:
該參數具體含義爲:判斷集羣是否平衡的目標參數,每個 Datanode 存儲使用率和集羣總存儲使用率的差值都應該小於這個閥值,理論上,該參數設置的越小,整個集羣就越平衡,可是在線上環境中,Hadoop集羣在進行balance時,還在併發的進行數據的寫入和刪除,因此有可能沒法到達設定的平衡參數值。
參數-policy表示的平衡策略,默認爲DataNode。
該參數的具體含義爲:應用於從新平衡 HDFS 存儲的策略。默認DataNode策略平衡了 DataNode 級別的存儲。這相似於以前發行版的平衡策略。BlockPool 策略平衡了塊池級別和 DataNode 級別的存儲。BlockPool 策略僅適用於 Federated HDFS 服務。
參數-exclude和-include是用來選擇balancer時,能夠指定哪幾個DataNode之間重分佈,也能夠從HDFS集羣中排除哪幾個節點不須要重分佈,好比:
hdfs balancer -include CDHD,CDHA,CDHM,CDHT,CDHO
除了上面的參數會影響HDFS數據重分佈,還有以下的參數也會影響重分佈,
dfs.datanode.balance.bandwidthPerSec, dfs.balance.bandwidthPerSec
該默認設置:1048576(1M/s),我的建議若是機器的網卡和交換機的帶寬有限,能夠適當下降該速度,通常默認就能夠了。
該參數含義以下:
HDFS平衡器檢測集羣中使用過分或者使用不足的DataNode,並在這些DataNode之間移動數據塊來保證負載均衡。若是不對平衡操做進行帶寬限制,那麼它會很快就會搶佔全部的網絡資源,不會爲Mapreduce做業或者數據輸入預留資源。參數dfs.balance.bandwidthPerSec定義了每一個DataNode平衡操做所容許的最大使用帶寬,這個值的單位是byte,這是很不直觀的,由於網絡帶寬通常都是用bit來描述的。所以,在設置的時候,要先計算好。DataNode使用這個參數來控制網絡帶寬的使用,但不幸的是,這個參數在守護進程啓動的時候就讀入,致使管理員沒辦法在平衡運行時來修改這個值,若是須要調整就要重啓集羣。
下面簡單介紹一下balancer的原理:
Rebalance程序做爲一個獨立的進程與NameNode進行分開執行。
步驟1:
Rebalance Server從NameNode中獲取全部的DataNode狀況:每個DataNode磁盤使用狀況。
步驟2:
Rebalance Server計算哪些機器須要將數據移動,哪些機器能夠接受移動的數據。而且從NameNode中獲取須要移動的數據分佈狀況。
步驟3:
Rebalance Server計算出來能夠將哪一臺機器的block移動到另外一臺機器中去。
步驟4,5,6:
須要移動block的機器將數據移動的目的機器上去,同時刪除本身機器上的block數據。
步驟7:
Rebalance Server獲取到本次數據移動的執行結果,並繼續執行這個過程,一直沒有數據能夠移動或者HDFS集羣以及達到了平衡的標準爲止。
實戰:
找一個比較空閒的的Datanode執行,建議不要在NameNode執行:
hdfs balancer -include CDHD,CDHA,CDHM,CDHT,CDHO
執行過程以下(部分),你們能夠對照上面的流程看日誌,可能會更清楚一點:
16/07/11 09:35:12 INFO balancer.Balancer: namenodes = [hdfs://CDHB:8022]
16/07/11 09:35:12 INFO balancer.Balancer: parameters = Balancer.Parameters [BalancingPolicy.Node, threshold = 10.0, max idle iteration = 5, number of nodes to be excluded = 0, number of nodes to be included = 5, run during upgrade = false]
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
16/07/11 09:35:14 INFO net.NetworkTopology: Adding a new node: /default/192.168.1.130:50010
16/07/11 09:35:14 INFO net.NetworkTopology: Adding a new node: /default/192.168.1.131:50010
16/07/11 09:35:14 INFO net.NetworkTopology: Adding a new node: /default/192.168.1.135:50010
16/07/11 09:35:14 INFO net.NetworkTopology: Adding a new node: /default/192.168.1.138:50010
16/07/11 09:35:14 INFO net.NetworkTopology: Adding a new node: /default/192.168.1.139:50010
16/07/11 09:35:14 INFO balancer.Balancer: 2 over-utilized: [192.168.1.130:50010:DISK, 192.168.1.135:50010:DISK]
16/07/11 09:35:14 INFO balancer.Balancer: 1 underutilized: [192.168.1.131:50010:DISK]
16/07/11 09:35:14 INFO balancer.Balancer: Need to move 203.48 GB to make the cluster balanced.
16/07/11 09:35:14 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.130:50010:DISK to 192.168.1.131:50010:DISK
16/07/11 09:35:14 INFO balancer.Balancer: Decided to move 10 GB bytes from 192.168.1.135:50010:DISK to 192.168.1.138:50010:DISK
16/07/11 09:35:14 INFO balancer.Balancer: Will move 20 GB in this iteration
16/07/11 09:36:00 INFO balancer.Dispatcher: Successfully moved blk_1074048042_307309 with size=134217728 from 192.168.1.130:50010:DISK to 192.168.1.131:50010:DISK through 192.168.1.130:50010
16/07/11 09:36:07 INFO balancer.Dispatcher: Successfully moved blk_1074049886_309153 with size=134217728 from 192.168.1.135:50010:DISK to 192.168.1.138:50010:DISK through 192.168.1.135:50010
16/07/11 09:36:09 INFO balancer.Dispatcher: Successfully moved blk_1074048046_307313 with size=134217728 from 192.168.1.130:50010:DISK to 192.168.1.131:50010:DISK through 192.168.1.130:50010
16/07/11 09:36:10 INFO balancer.Dispatcher: Successfully moved blk_1074049900_309167 with size=134217728 from 192.168.1.135:50010:DISK to 192.168.1.138:50010:DISK through 192.168.1.135:50010
16/07/11 09:36:16 INFO balancer.Dispatcher: Successfully moved blk_1074048061_307328 with size=134217728 from 192.168.1.130:50010:DISK to 192.168.1.131:50010:DISK through 192.168.1.130:50010
16/07/11 09:36:17 INFO balancer.Dispatcher: Successfully moved blk_1074049877_309144 with size=134217728 from 192.168.1.135:50010:DISK to 192.168.1.138:50010:DISK through 192.168.1.135:50010
若是你使用的是CDH集成平臺,也能夠經過CM來執行數據重分佈:
步驟1:先選擇HDFS組件的頁面,以下:
步驟2:找到頁面右側的操做選擇,從下拉框中選擇數據「從新平衡」選項
步驟3:肯定「從新平衡」就開始安裝默認的設置規則從新分佈DataNode的Block數據了,能夠用CM的日誌中查看具體的執行過程。