Hadoopのバランサー実行中にdfs.datanode.balance.bandwidthPerSecを変える
Hadoopにはバランサーというものがあります。象本10.1.4.4 バランサー参照。
Hadoopでは時間の経過とともにDataNode間でのブロックの分散度合いのバランスが悪くなっていきます。これを是正するためのプログラムがバランサーで実態はstart-balancer.shというシェルです。
start-balancer.shは利用度の高すぎるDataNodeから利用度の低すぎるDataNodeへブロックを移動するプログラムです。
-threshold引数はバランス度合いを決めるパーセンテージでデフォルトは10です。各DataNodeの利用率とクラスタの利用率の差を意味しています。
start-balancer.shをcronでたたくという運用もあるようですが、僕が見た範囲だと何もしなくても10%以内の隔たりに収まる気がします。
ただ今回僕が遭遇したのはディスク使用率が高いという警告が出ているけれども削除できるものがすぐ見つからないという状況でした。
なので暫定策として-thresholdを5にしてディスク使用率が高いDataNodeから低いDataNodeにブロックを移動するということを試みました。
ただここでちょっとした不都合がありました。ブロック移動に使う帯域はdfs.datanode.balance.bandwidthPerSecで指定しますがこれはデフォルトだと1MB/sで遅いんですよね。。。start-balancer.shを実行してログを見てもなかなか進まない。
と思っていたんですが、そういえばdfs.datanode.balance.bandwidthPerSecを変えてもDataNodeを再起動しなくてもいいみたいなJIRAがあったことを思い出しました。
該当のJIRAはこちら
[HDFS-2202] Changes to balancer bandwidth should not require datanode restart. - ASF JIRA
Hadoop 1.0.3で確認したけどCDH3u5でもいけるはず。
例えば以下のコマンドたたいて帯域を1GBにしてみました。
hadoop dfsadmin -setBalancerBandwidth 1073741824
そうやってバランサーのログを見るとこんな感じになってました。
最初は1G移動するのにも20分程度かかってたのが帯域変えたら10G移動するのに2分程度です。スバラシ。
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved Jan 5, 2013 10:01:52 PM 0 0 KB 533.84 GB 10 GB Jan 5, 2013 10:23:53 PM 1 1.28 GB 536.56 GB 10 GB Jan 5, 2013 10:43:58 PM 2 11.31 GB 524.56 GB 10 GB Jan 5, 2013 10:46:12 PM 3 21.36 GB 512.43 GB 10 GB Jan 5, 2013 10:48:36 PM 4 31.39 GB 507.58 GB 10 GB Jan 5, 2013 10:50:53 PM 5 41.44 GB 496.54 GB 10 GB Jan 5, 2013 10:53:03 PM 6 51.36 GB 485.88 GB 10 GB
帯域が変わったかどうか確認するにはDataNodeのログに以下にように出てればOKのようです。
INFO org.apache.hadoop.hdfs.server.datanode.DataNode: DatanodeCommand action: DNA_BALANCERBANDWIDTHUPDATE
CDH3u5だと以下のJIRAも入っているので変更後の帯域も出るようです。
[HDFS-2391] Newly set BalancerBandwidth value is not displayed anywhere - ASF JIRA