JobTrackerでFull GC

hadoop-env.shのHADOOP_JOBTRACKER_OPTSのところに下記を追加してコンカレントGCを有効にしてかつGCログも取りつつ運用していたのだが、JobTrackerでFull GCが連発するということがおこった。

-XX:+UseConcMarkSweepGC

GCログはこんな感じ。この後もずっとFull GCが出てた。

2014-03-03T18:11:17.056+0900: 1146198.271: [CMS-concurrent-mark-start]
2014-03-03T18:11:20.092+0900: 1146201.308: [Full GC2014-03-03T18:11:20.093+0900: 1146201.308: [CMS2014-03-03T18:11:22.732+0900: 1146203.947: [CMS-concurrent-mark: 5.665/5.676 secs] [Times: user=25.32 sys=0.28, real=5.67 secs]
 (concurrent mode failure): 7864320K->7864319K(7864320K), 39.2705950 secs] 8336191K->7893297K(8336192K), [CMS Perm : 23526K->23526K(42064K)], 39.2707950 secs] [Times: user=47.12 sys=0.05, real=39.27 secs]
2014-03-03T18:12:01.367+0900: 1146242.582: [GC [1 CMS-initial-mark: 7864319K(7864320K)] 8079400K(8336192K), 0.3302100 secs] [Times: user=0.33 sys=0.00, real=0.33 secs]
2014-03-03T18:12:01.698+0900: 1146242.913: [CMS-concurrent-mark-start]

約40秒間stop the worldになっており、JobTrackerのGCログでないほうのログを見ても該当時間のログは無かった。

ちょうどこの時間帯にmap task数が7万を超えるジョブが走っていたのが原因と思われる。

基本的には下記と同じ現象だと思う。たぶん。JobTrackerの再起動で対応した(対応したのオレじゃないけど)。

次にMapReduceがらみですけど、JobTrackerのフリーズみたいなのは2回ぐらい経験しました。原因ははっきりしないですけど、最近起きたやつはmap数が大量(例:3万とか)のジョブを複数submitしてOutOfMemoryになっていたのでその辺が原因なのかなと思います。

Hadoopの運用について書いてみる - wyukawa’s blog

なので下記とは違うような気がする。

Hadoop MapReduceのバグ自体はそんなにヒットしていないのですが、シビアな奴は有名なJobTrackerのメモリリークぐらいでした。

http://kzk9.tumblr.com/post/69268410641/2013-hadoop-treasure-data

GCログにconcurrent mode failureと出ているが、これはどうやらConcurrent Markのフェーズでold領域がいっぱいで新しくオブジェクトが割り当てられない状況になりアプリケーションスレッドとGCスレッドを両方動かすことができず、
アプリケーションスレッドが停止してstop the worldになったということらしい。

普段の定期的なバッチでは問題無く、こういうadhocなジョブが入ってきたときだけ問題になるという状況だった。

メモリを増やせば解決するのかなあと思いつつまだ何もやってない。

参考にしたもの: