HDFS的Block數據balancer重分佈實戰

描述:今天早上到公司,發現測試集羣中的一臺機器的磁盤使用率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的日誌中查看具體的執行過程。

\

參考博客:https://www.2cto.com/net/201607/525222.html

相關文章
相關標籤/搜索