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 一起交流,一起進步!!
--------------------------------------------------------------------------------------------------------------------------------------------------------------------