問題:hadoop出現報警,有些節點數據磁盤已經占用了90%,有些節點磁盤用了50%
解決:HDFS自帶的balancer工具來解決,保證每個節點的數據分布均衡
方法-全節點&個別節點平衡:
1.設置帶寬
hdfs dfsadmin -setBalancerBandwidth 104857600 \\手工增加帶寬,否則數據移動時候帶寬會變大,hdfs有默認值的
\\參數含義:設置balance工具在運行中所能占用的帶寬,設置的過大可能會造成mapred運行緩慢
2.設置節點間的差異閾值
hdfs balancer
這個命令中-t參數后面跟的是HDFS達到平衡狀態的磁盤使用率偏差值。如果機器與機器之間磁盤使用率偏差小於10%,那么我們就認為HDFS集群已經達到了平衡的狀態。-threshold 10 \\集群平衡的條件,datanode間磁盤使用率相差閾值,區間選擇:0~100 \\Threshold參數為集群是否處於均衡狀態設置了一個目標
\\threshold 默認設置:10,參數取值范圍:0-100,參數含義:判斷集群是否平衡的目標參數,每一個 datanode 存儲使用率和集群總存儲使用率的差值都應該小於這個閥值 ,
\\理論上,該參數設置的越小,整個集群就越平衡,但是在線上環境中,hadoop集群在進行balance時,還在並發的進行數據的寫入和刪除,所以有可能無法到達設定的平衡參數值。-policy datanode \\默認為datanode,datanode級別的平衡策略 -exclude -f /tmp/ip1.txt \\默認為空,指定該部分ip不參與balance, -f:指定輸入為文件 -include -f /tmp/ip2.txt \\默認為空,只允許該部分ip參與balance,-f:指定輸入為文件 -idleiterations 5 \\迭代次數,默認為 5
原理:
Hadoop的開發人員在開發Balancer程序的時候,遵循了以下幾點原則:
1. 在執行數據重分布的過程中,必須保證數據不能出現丟失,不能改變數據的備份數,不能改變每一個rack中所具備的block數量。
2. 系統管理員可以通過一條命令啟動數據重分布程序或者停止數據重分布程序。
3. Block在移動的過程中,不能暫用過多的資源,如網絡帶寬。
4. 數據重分布程序在執行的過程中,不能影響name node的正常工作。
說明:
Rebalance程序作為一個獨立的進程與name node進行分開執行。
1 Rebalance Server從Name Node中獲取所有的Data Node情況:每一個Data Node磁盤使用情況。
2 Rebalance Server計算哪些機器需要將數據移動,哪些機器可以接受移動的數據。並且從Name Node中獲取需要移動的數據分布情況。
3 Rebalance Server計算出來可以將哪一台機器的block移動到另一台機器中去。
4,5,6 需要移動block的機器將數據移動的目的機器上去,同時刪除自己機器上的block數據。
7 Rebalance Server獲取到本次數據移動的執行結果,並繼續執行這個過程,一直沒有數據可以移動或者HDFS集群以及達到了平衡的標准為止。
balancer在如下5種情況下會自動退出:
- 集群已達到均衡狀態;
- 沒有block能被移動;
- 連續5次迭代移動沒有任何一個block被移動;
- 當與namenode交互式出現了IOException;
- 另一個balancer在運行中。
