About connecting the dots.

data science related trivial things

JobTrackerのヒープ領域を増やしてOOMEを防ぐ

Hadoopで重たいジョブをたくさん回していると,JobTrackerのヒープ領域がだんだん食われていって,そのうちOut of Memory Errorになって落ちちゃうことが結構多いんですよね.なんか適切にGCとかしてくれないのかなぁとか思うんですが,Dark side of Hadoopとか読んでる限り,長く使うとプロセスがゾンビ化してしまうよねみたいなことが書かれてるんですよね.

ということで,それを防ぐためには単純にJobTrackerのヒープ領域を大きくしてあげればいいんじゃないかなと思いました.HADOOP_HOME/conf/hadoop-env.shのHADOOP_JOBTRACKER_OPTSを書き換えて下のようにすればOKですね.4GBあればさすがにだいたい持つんではないでしょうか.

export HADOOP_JOBTRACKER_OPTS="$HADOOP_JOBTRACKER_OPTS -Xmx4g"

ちなみにデフォルトだと,以下のHADOOP_HEAPSIZEが使われるようですね.初期設定だと1000,つまり1GBなので,ヘビーに使うと割とすぐになくなります.この値をかえると,NameNodeとかTaskTrackerとかほかのデーモンも大きなサイズになってしまうので,それはそれで困りものです。

export HADOOP_HEAPSIZE=1000

Hadoopの運用とかやると,地味にトラブル続きなわけですが,安定のClouderaサポートのスライドを読んでがんばりましょう.

Hadoopのシステム設計・運用のポイント

ていうかJobTrackerに限らず,TaskTrackerでもDataNodeでも,過負荷やらで落ちたプロセスが割と簡単にゾンビ化するのどうにかなりませんかね,実際.JobTrackerなら1台だけだからまだしも,ひどい書き方のPig/Hiveジョブのせいで複数のTaskTrakerがゾンビ化した暁には,がんばって1台ずつkillしないと行けない悲しみがもれなく待っているわけです.まぁkillプロセスを自動化しろよという話なのかもしれませんけど,それってどうよという気もします.