Sparkで大きなファイルを処理する際などに「java.lang.OutOfMemoryError: GC overhead limit exceeded」が発生する場合があります。
この際の対処方法をいかに記述します
GC overhead limit exceededとは
簡単にいうと
- GCが処理時間全体の98%以上を占める
- GCによって確保されたHeapが2%以下
の場合に発生します
潜在的なメモリリークに対応するため追加されたもののようですね
対応策1: 該当機能をOFFにする
一番簡単な方法は該当機能をOFFにすることです
/spark/conf配下にspark-defaults.conf.templateというファイルがあるので、これをspark-defaults.confにリネームします
(macユーザの方はFinder上でリネームするだけではなく、エディタで別名保存してくださいね)
そしてconf内に以下の文字列を加えてください
spark.executor.extraJavaOptions -XX:-UseGCOverheadLimit
これによりJVMに該当オプションがわたり機能が無効化されます
対応策2: Heapを増やす
対応策1で該当機能をOFFにしましたが、これでは根本解決にはなっていません
そのためHeapを増やしたいと思います
JVMのHeapを増やしたいのであればオプションで渡すだけだから、上記Keyでいいのでは?と思いますがManualにはこんな記述があります
Note that it is illegal to set Spark properties or heap size settings with this option.(中略) Heap size settings can be set with spark.executor.memory.
というわけでここに指摘のあるspark.executor.memoryを増やしてあげましょう
spark.executor.memory 2g
これで解決です
ちなみにtemplate内にあるspark.driver.memoryですが、これはdriverプロセスに割り当てるものです
どちらもdefaultは512mなので合わせてあげると良いかと思います