HadoopのMapReduceの運用

http://kzk9.tumblr.com/post/69268410641/2013-hadoop-treasure-dataを見て良いエントリだなと思いつつそういやHadoopMapReduceの運用ってどうやんのがいいんだろって思って本エントリを書きました。

Treasure Dataに限らずある程度の規模のHadoopクラスターでMapReduceを運用してるところってどんな感じでやってるんだろうな。

僕が経験したものとしては

です。


HDD障害はひどい時は毎日起きてたんだけどmapとreduceのスロット数を減らしたらぱったり起きなくなった。最初はメモリだけ見てたんだけどCPUも考慮してload状況をみないとダメね。

参考にしたのは下記スライド


shuffleのやつはGraylisted NodesにTaskTrackerが入ったら再起動するようにしてたんだけど最近は全く起きてない。もしかしたらHadoopのバージョンアップ(1.0.3 -> 1.2.1)が功を奏したのかも。


JobTrackerのOutOfMemoryは最近起きたんだけどとりあえずJobTrackerおよびTaskTrackerの再起動でのりきった。カジュアル。

当時の状況としてはmap数が数万のジョブが複数個投入されていてTaskTrackerのノード数が0になっててジョブが全く進まないというものだった。

なおTaskTrackerを再起動するとmapred.local.dirで指定したディレクトリを初期化するみたいでJobTrackerに認識されるまで時間がかかる(場合によっては1時間以上かかる)ので別名にrenameしてからTaskTrackerを起動した。rmだと時間かかるけどmvなら一瞬だからね。

GitHub - repeatedly/hadoop-metrics: Wrapper for Hadoop Metrics APIを入れてafter_gcをモニタリングしようかなとちょっと思ってるけど、そもそもHadoopのメトリクスは膨大で何をモニタリングしてどうなったらアラートをあげてどう対応するのがいいのかさっぱりわからん。。。


HiveジョブのOutOfMemoryErrorはjoinする際に起きていて以下のようなスタックトレースを出力してた。再現性はなくて再実行したら大丈夫。シャッフルのところでOutOfMemoryErrorが出ててmapred.job.shuffle.input.buffer.percentをdefaultの0.7から0.3に下げて様子見ているけど今のところ大丈夫そう。

Error: java.lang.OutOfMemoryError: Java heap space
	at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1703)
	at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1563)
	at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1401)
	at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1333)


Hadoopの運用を勉強するためにHadoopオペレーションを買ってパラパラ読んでる。まあ良い本だと思うんだけど、もっと詳しい解説が欲しいかなーって思ってる。例えば10.3.2 すべてのHadoopプロセス のところでメモリの話があるんだけど推奨するチェックのところでヒープ、ガベージコレクションの回数をモニタリングしてくださいってあるんだけど、もうちょっと具体的にJMXのこの項目をこういう観点でチェックしてくださいとかあったら神本な気がする。や、実は書いてあるといえばあるけどイマイチ理解できなかった。。。

Hadoopオペレーション ―システム運用管理ガイド

Hadoopオペレーション ―システム運用管理ガイド