hadoop balancer簡單介紹及balancer平衡速度的優化

hadoop balance官網介紹:

  HDFS data might not always be be placed uniformly across the DataNode. One common reason is addition of new DataNodes to an existing cluster. While placing new blocks (data for a file is stored as a series of blocks), NameNode considers various parameters before choosing the DataNodes to receive these blocks. Some of the considerations are:

  • Policy to keep one of the replicas of a block on the same node as the node that is writing the block.

  • Need to spread different replicas of a block across the racks so that cluster can survive loss of whole rack.

  • One of the replicas is usually placed on the same rack as the node writing to the file so that cross-rack network I/O is reduced.

  • Spread HDFS data uniformly across the DataNodes in the cluster.

Due to multiple competing considerations, data might not be uniformly placed across the DataNodes. HDFS provides a tool for administrators that analyzes block placement and rebalanaces data across the DataNode. A brief administrator’s guide for balancer is available at HADOOP-1652

翻譯:

  HDFS數據可能並不總是均勻地放置在DataNode上。一個常見原因是向現有集羣添加了新的DataNode。放置新塊時(文件的數據存儲爲一系列塊),NameNode在選擇接收這些塊的DataNode之前會考慮各種參數。一些考慮因素是:

  • 將塊中的一個副本保留在與寫入塊的節點相同的節點上的策略。

  • 需要在機架上傳播塊的不同副本,以便羣集可以在整個機架丟失時存活。

  • 其中一個副本通常與寫入文件的節點放在同一個機架上,以便減少跨機架網絡I / O.

  • 在羣集中的DataNode上統一傳播HDFS數據。

由於多個競爭考慮因素,數據可能無法統一放置在DataNode上。HDFS爲管理員提供了一種工具,可以分析數據塊的塊放置和重新平衡數據。有關平衡器的簡要管理員指南,請訪問HADOOP-1652

    也就是說:在線上的hadoop集羣運維過程中,hadoop的balance工具通常用於平衡hadoop集羣中各datanode中的文件塊分佈,以避免出現部分datanode磁盤佔用率高的問題(這問題也很有可能導致該節點CPU使用率較其他服務器高)。

 

 hadoop balance工具的用法:

To start:
bin/start-balancer.sh [-threshold <threshold>]
Example: bin/ start-balancer.sh
start the balancer with a default threshold of 10%
bin/ start-balancer.sh -threshold 5
start the balancer with a threshold of 5%
 
To stop:
bin/ stop-balancer.sh

官方參數介紹:

用法:

    hdfs平衡器
          [-threshold <threshold>]
          [-policy <policy>]
          [-exclude [-f <hosts-file> | <以逗號分隔的主機列表>]]
          [-include [-f <hosts-file> | <以逗號分隔的主機列表>]]
          [-idleiterations <idleiterations>]
命令選項 描述
-policy <policy> datanode(默認值):如果每個datanode均衡,則羣集是平衡的。
blockpool:如果每個datanode中的每個塊池都是平衡的,則羣集是平衡的。
-threshold <threshold> 磁盤容量的百分比。這會覆蓋默認閾值。
-exclude -f <hosts-file> | <以逗號分隔的主機列表> 排除指定的數據節點被平衡器平衡。
-include -f <hosts-file> | <以逗號分隔的主機列表> 僅包括由平衡器平衡的指定數據節點。
-idleiterations <iterations> 退出前的最大空閒迭代次數。這會覆蓋默認的空閒狀態(5)。

   默認使用的datanode policy,用的時候一般設置一下 threshold 就行,這個參數是觸發進行balance的閾值,默認是10,意思是集羣中datanode空間使用率差了10%就開始balance。

 

平衡速度優化:

下面簡單介紹一下優化Hadoop Balancer平衡的速度涉及到的幾個重要參數

1.  dfs.datanode.max.transfer.threads

修改dfs.datanode.max.transfer.threads=4096 (如果運行HBase的話建議爲16384),指定用於在DataNode間傳輸block數據的最大線程數,老版本的對應參數爲dfs.datanode.max.xcievers。

2.  dfs.datanode.balance.bandwidthPerSec

修改dfs.datanode.balance.bandwidthPerSec=52428800,指定DataNode用於balancer的帶寬爲50MB,這個根據情況而定,如果交換機性能好點的,完全可以設定100MB,單位是Byte,如果機器的網卡和交換機的帶寬有限,可以適當降低該速度,比如10MB,默認是1048576(1MB)。

hdfs dfsadmin-setBalancerBandwidth 52428800

線上場景:

     Hadoop生產環境上,HDFS分配非常不均勻,而且有的DataNode節點的磁盤使用率幾乎100%了,導致一些作業報錯。後來公司採取Hadoop balancer來對數據進行平衡操作,但是數據量太大,高達50T作業,所以採用Hadoop balancer方法進行平衡,需要的時間太長。

做法:

     調整hadoop halancer的參數,比如線程數,帶寬等,效果都沒有那麼明顯,畢竟數據量太大。後面考慮到他們的數據副本爲3,所以可以考慮將一些DataNode磁盤利用率太高的節點先下線操作(必須逐個節點操作,不可同時下線多個節點,防止數據丟失),即Decommission Datanode。完成下線後,再進行格式化數據磁盤操作,然後再將此DataNode添加到集羣中,這樣新的數據就會較快地同步過來。

 

最後,我們補充點Decommission Datanode相關知識。

Decommission Datanode主要有兩個步驟:

1.  在Namenode上,把需要Decommission的Datanode的機器名加入到dfs.hosts.exclude(該配置項在hdfs-site.xml)所指定文件中,也就是告訴Namenode哪些Datanode要被Decommission。

把需要Decommission的節點寫到文件/etc/hadoop/conf/dfs.exclude中去。

<property>   

<name>dfs.hosts.exclude</name>

<value>/etc/hadoop/conf/dfs_decommission.exclude</value>

</property>

2.  用如下命令啓動Decommission

  #hdfs dfsadmin -refreshNodes

Decommission Datanode的時候需要保證在該Datanode移除以後,HDFS上的文件還能滿足replica factor的最低要求。

比如,一個只有3個Datanode的HDFS集羣,文件默認replica factor(dfs.replication參數設置)是3,那麼移除任何一個Datanode都會導致某些文件不能滿足replica factor的最低要求。當試圖移除一個Datanode的時候,會一直處在Decommissioning的狀態,因爲它找不到別的機器來遷移它的數據了。這個問題通常容易出現在小集羣上。

一個解決辦法就是臨時把相應文件的replica factor調低。

1. 用如下命令來查看HDFS中所有文件的replica factor

     #hdfsfsck / -files -blocks

其中repl=1表示該文件的該block的replica factor爲1。通過這個命令就可以找到那些replica factor比較高的文件了。

2 . 調整文件的replicafactor 

我們需要注意的是,replica factor是文件的屬性,而不是集羣的屬性,也就是說同一個集羣中的文件可以有不同的replica factor。因此,我們需要針對文件修改replica factor。對應的命令是:

 #hdfs dfs -setrep [-R] [-w] <rep><path>

其中

  • -R表示recursive,可以對一個目錄及其子目錄設置replica factor,即是否使用遞歸

  • -w表示等待複製完成,可能需要等待很長時間

  • <rep>表示需要設置的replica factor的值

  • <path>表示需要設置的replica factor的文件或目錄路徑

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

      用人品去感動別人,用改變去影響別人,用狀態去燃燒別人,用行動去帶動別人,用陽光去照耀別人,用堅持去贏得別人,要求自己每天都去做與目標有關的事情,哪怕每天只進步一點點,堅持下來你就是最優秀卓越的!歡迎大家加入大數據交流羣:725967421     一起交流,一起進步!!

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章