Hadoopサーバのディスク容量減少アラートが飛んできた!ってときにどう対処するか

もう何番煎じか分からなくなってきましたがHadoop版が無いので書いてみます。


2013/08/05追記
Hadoop 1.0.3の話を書いています。


まずHBaseを使っている場合はcompactionがある関係上Disk使用率は50%以内に抑えておくのが無難だと思います。この辺はCassandraと同じですね。

次にNameNodeの場合はdfs.name.dirで指定したディレクトリにメタデータを書くわけですが、このパーティションがDisk Fullになった場合はNameNodeがdownします。大変危険ですので注意しましょう。NameNodeのメタデータ専用でシステム領域以外のパーティションを用意してそこにメタデータを書くようにするのが一番良いでしょう。パーティションを分けておけばHadoopのログが肥大化した場合などでも別パーティションなので影響を受けることがなくなります。

次にDataNodeです。まずデータは圧縮して格納するのが基本です。まあぶっちゃけそれでも容量が足りなくなったらサーバー追加するのが良いわけですがすぐには追加できないのでしばらく耐え忍ぶ必要があるケースがあるでしょう。

その場合はhadoop fs -duとかhadoop fs -dusで容量をくっているところを見つけて不要なら削除します。hadoop fs -rmで削除してもTrashが有効になっている(fs.trash.intervalが設定されている)場合は.Trashにmvするだけなのでそこも消しましょう。

Hiveのexternal tableの場合、drop partitionしてもデータは残っているのでhadoop fs -rmで削除する必要があります。

あとhadoop fs -setrepで複製数を減らすという手段がありますが、これはHDD障害が連続するとmissing blockになりやすいのであまりおすすめしません。それよりは保存期間、HBaseならTTLを減らすほうが良い気がします。

ちょっと厄介なのがDataNodeでDiskを何本か搭載していてDisk間でアンバランスな状態になっている場合があります。Disk1は80%の使用率でDisk2は50%の使用率みたいなケースですね。HDD障害があって交換して運用しているとこうなります。CDH4.3にも入った[HDFS-1804] Add a new block-volume device choosing policy that looks at free space - ASF JIRAが使えるなら大丈夫でしょうが、そうじゃないケースの方が多いですよね。。。

この場合どうするかっていうと、、、一旦decommissionしてからcommissionするのがいいんでしょうけどそんなに容量に余裕がない場合もあります。この場合DataNodeを一旦stopして手動で各blockを空いているパーティションにmvするという方法がありますが、これもあんまりおすすめできませんね。。。

というわけで、結論としては容量不足になる前にノード追加しとけってことですね!