課題
Hadoopでhdfsを使用しているが下記の様なことが発生した
- 特定のノードだけ妙にswapしたり負荷が高くなったりする
- 追加したノードが使われていない気がする。
原因
HDFSは、頻繁に書き込みや削除を繰り返すとデータに偏りが出てきてしまうため(データの断片化)、特定のノードにデータを取得してしまうため負荷も偏ってしまう。
また、ノードを追加した時に自動で再バランスするわけではないので、手動で再バランスをするか、新しいファイルを作るタイミングからブロックを割り当てるのを待つしかないようです。
再バランス結果
各ノードのデータ量を平準化するためCloudera Managerで再バランスをしてみる
手順
サービス -> hdfs -> アクション -> 再バランス
結果ログ
2014-01-07 12:34:12,342 INFO [main] balancer.Balancer (Balancer.java:parse(1538)) - Using a threshold of 10.0
2014-01-07 12:34:12,351 INFO [main] balancer.Balancer (Balancer.java:run(1417)) - namenodes = [hdfs://nameservice1]
2014-01-07 12:34:12,353 INFO [main] balancer.Balancer (Balancer.java:run(1418)) - p = Balancer.Parameters[BalancingPolicy.Node, threshold=10.0]
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved
2014-01-07 12:34:14,239 INFO [main] net.NetworkTopology (NetworkTopology.java:add(393)) - Adding a new node: /default/192.168.1.1:50010
(snip)
2014-01-07 12:34:14,253 INFO [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 over-utilized: []
2014-01-07 12:34:14,257 INFO [main] balancer.Balancer (Balancer.java:logNodes(907)) - 2 underutilized: [BalancerDatanode[192.168.1.6:50010, utilization=0.35506872895520886], BalancerDatanode[192.168.1.7:50010, utilization=0.372112826760373]]
2014-01-07 12:34:14,264 INFO [main] balancer.Balancer (Balancer.java:run(1344)) - Need to move 91.54 GB to make the cluster balanced.
2014-01-07 12:34:14,267 INFO [main] balancer.Balancer (Balancer.java:chooseSource(1086)) - Decided to move 10 GB bytes from 192.168.1.2:50010 to 192.168.1.6:50010
2014-01-07 12:34:14,268 INFO [main] balancer.Balancer (Balancer.java:chooseSource(1086)) - Decided to move 10 GB bytes from 192.168.1.3:50010 to 192.168.1.7:50010
2014-01-07 12:34:14,273 INFO [main] balancer.Balancer (Balancer.java:run(1358)) - Will move 20 GB in this iteration
Jan 7, 2014 12:34:14 PM 0 0 B 91.54 GB 20 GB
(snip)
2014-01-07 14:01:52,211 INFO [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 over-utilized: []
2014-01-07 14:01:52,212 INFO [main] balancer.Balancer (Balancer.java:logNodes(907)) - 0 underutilized: []
The cluster is balanced. Exiting...
Balancing took 1.4613238888888889 hours
まとめ
- 多少の速度低下はあったものの運用したままで再バランスすることはできた
- 2つのノードを新規追加した場合、再バランスを実行すると自動で検出して既存のノードから10GBずつ分配された.
- 全体が1.5TBのデータで91.54GBが再バランス対象を完了するのに1時間半位かかった。(NetworkやIO速度に依存するけど。。)