Hadoop2.7實戰v1.0之start-balancer.sh與hdfs balancer資料均衡

hackeruncle發表於2016-03-09
Hadoop2.7實戰v1.0之start-balancer.sh與hdfs balancer資料均衡【修正版】

適用場景:

a.當動態新增或者刪除叢集的資料節點,必然會使各節點的資料不均衡

b.當正常維護時


1.hdfs負載設定均衡,因為預設的資料傳輸頻寬比較低,可以設定為64M

hdfs dfsadmin -setBalancerBandwidth 67108864即可

點選(此處)摺疊或開啟

  1. [root@sht-sgmhadoopnn-01 ~]# cd /hadoop/hadoop-2.7.2/bin
  2. [root@sht-sgmhadoopdn-01 bin]# ./hdfs dfsadmin -setBalancerBandwidth 67108864
  3. Balancer bandwidth is set to 67108864 for sht-sgmhadoopnn-01/172.16.101.55:8020
  4. Balancer bandwidth is set to 67108864 for sht-sgmhadoopnn-02/172.16.101.56:8020

2.預設balancerthreshold10%,即各個節點儲存使用率偏差不超過10%,我們可將其設定為5%;然後啟動Balancer,sbin/start-balancer.sh -threshold 5,等待叢集自均衡完成即可

點選(此處)摺疊或開啟

  1. [root@sht-sgmhadoopdn-01 bin]# cd ../sbin
  2. starting balancer, logging to /hadoop/hadoop-2.7.2/logs/hadoop-root-balancer-sht-sgmhadoopnn-01.telenav.cn.out
  3. [root@sht-sgmhadoopnn-01 sbin]# ./start-balancer.sh -threshold 5
  4. starting balancer, logging to /hadoop/hadoop-2.7.2/logs/hadoop-root-balancer-sht-sgmhadoopnn-01.telenav.cn.out

###執行這個命令start-balancer.sh -threshold 5和使用hdfs balancer -threshold 5是一樣的

#### Usage: hdfs balancer

點選(此處)摺疊或開啟

  1. [root@sht-sgmhadoopnn-01 bin]# ./hdfs balancer -threshold 5
  2. 16/03/05 18:57:33 INFO balancer.Balancer: Using a threshold of 1.0
  3. 16/03/05 18:57:33 INFO balancer.Balancer: namenodes = [hdfs://mycluster]
  4. 16/03/05 18:57:33 INFO balancer.Balancer: parameters = Balancer.Parameters[BalancingPolicy.Node, threshold=1.0, max idle iteration = 5, number of nodes to be excluded = 0, number of nodes to be included = 0]
  5. Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
  6. 16/03/05 18:57:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  7. 16/03/05 18:57:35 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.58:50010
  8. 16/03/05 18:57:35 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.60:50010
  9. 16/03/05 18:57:35 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.66:50010
  10. 16/03/05 18:57:35 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.59:50010
  11. 16/03/05 18:57:35 INFO balancer.Balancer: 0 over-utilized: []
  12. 16/03/05 18:57:35 INFO balancer.Balancer: 0 underutilized: []
  13. The cluster is balanced. Exiting...
  14. Mar 5, 2016 6:57:35 PM 0 0 B 0 B -1 B
  15. Mar 5, 2016 6:57:35 PM Balancing took 2.66 seconds
  1. 1).為什麼我執行該命令hdfs balancer -threshold 5平衡資料命令沒有反應呢?

5表示5% 

群總儲存使用率:        1.74%


sht-sgmhadoopdn-01:   1.74%

sht-sgmhadoopdn-02:   1.74%

sht-sgmhadoopdn-03:   1.74%

sht-sgmhadoopdn-04:     0%

執行-threshold  5, 表示每一個 datanode 儲存使用率和叢集總儲存使用率的差值都應該小於這個閥值5%

假如超過5%,會執行資料平衡操作。



B.  2).怎樣判斷執行命令是否會生效,資料平衡操作?

if  (群總儲存使用率  — 每一臺datanode 儲存使用率) > -threshold  5

      #會執行資料平衡

else

      #該命令不生效

end if

C.  3).the threshold  range of [1.0, 100.0],所以最小隻能設定 -threshold  1

D. 4).balance命令可以執行在namenode或者datanode節點上,最好在新增的或者空閒的資料節點上執行

3. 執行命令hdfs balancer -threshold 1

點選(此處)摺疊或開啟

  1. [root@sht-sgmhadoopnn-01 hadoop]# hdfs balancer -threshold 1
  2. ……………..
  3. ……………..
  4. 16/03/08 16:08:09 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.59:50010
  5. 16/03/08 16:08:09 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.58:50010
  6. 16/03/08 16:08:09 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.66:50010
  7. 16/03/08 16:08:09 INFO net.NetworkTopology: Adding a new node: /default-rack/172.16.101.60:50010
  8. 16/03/08 16:08:09 INFO balancer.Balancer: 0 over-utilized: []
  9. 16/03/08 16:08:09 INFO balancer.Balancer: 0 underutilized: []
  10. The cluster is balanced. Exiting...
  11. Mar 8, 2016 4:08:09 PM 1 382.22 MB 0 B -1 B
  12. Mar 8, 2016 4:08:09 PM Balancing took 6.7001 minutes

###新增資料節點的411.7M,偏差小於1%。

由於歷史原因,hadoop叢集中的機器的磁碟空間的大小各不相同,而HDFS在進行寫入操作時,並沒有考慮到這種情況,所以隨著資料量的逐漸增加,磁碟較小的datanode機器上的磁碟空間很快將被寫滿,從而觸發了報警。
此時,不得不手工執行start-balancer.sh來進行balance操作,即使將dfs.balance.bandwidthPerSec  引數設定為10M/s,整個叢集達到平衡也需要很長的時間,所以寫了個crontab來每天凌晨來執行start-balancer.sh,由於此時叢集不平衡的狀態還沒有那麼嚴重,所以start-balancer.sh很快執行結束了。
另外需要注意的地方是,由於HDFS需要啟動單獨的Rebalance Server來執行Rebalance操作,所以儘量不要在NameNode上執行start-balancer.sh,而是找一臺比較空閒的機器。
理論參考:


原始碼解析:

點選(此處)摺疊或開啟

  1. [root@sht-sgmhadoopnn-01 sbin]# more start-balancer.sh
  2. #!/usr/bin/env bash

  3. bin=`dirname "${BASH_SOURCE-$0}"`
  4. bin=`cd "$bin"; pwd`

  5. DEFAULT_LIBEXEC_DIR="$bin"/../libexec
  6. HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
  7. . $HADOOP_LIBEXEC_DIR/hdfs-config.sh

  8. # Start balancer daemon.

  9. "$HADOOP_PREFIX"/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer $@
  10. 解析:start-balancer.sh指令碼其實最終還是呼叫hdfs start balancer $@ 命令,對於 $@ 是指shell指令碼執行的傳遞的引數列表,一般引數為-threshold 5

  11. [root@sht-sgmhadoopnn-01 sbin]# more stop-balancer.sh
  12. #!/usr/bin/env bash

  13. bin=`dirname "${BASH_SOURCE-$0}"`
  14. bin=`cd "$bin"; pwd`

  15. DEFAULT_LIBEXEC_DIR="$bin"/../libexec
  16. HADOOP_LIBEXEC_DIR=${HADOOP_LIBEXEC_DIR:-$DEFAULT_LIBEXEC_DIR}
  17. . $HADOOP_LIBEXEC_DIR/hdfs-config.sh

  18. # Stop balancer daemon.
  19. # Run this on the machine where the balancer is running

  20. "$HADOOP_PREFIX"/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs stop balancer
  21. 解析:stop-balancer.sh指令碼其實最終還是呼叫hdfs stop balancer命令
  22. [root@sht-sgmhadoopnn-01 sbin]#


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30089851/viewspace-2052138/,如需轉載,請註明出處,否則將追究法律責任。

相關文章