SparkのTASKが停止する問題を回避する


こんにちは、@s_tsukaです。

Apache Sparkを触っていて困った現象に当たりましたが、なんとか解決できたのでそれについてメモしておきます。

既にほぼ同じこと解説しているスライドがslideshareにありますが、ぐぐってもなかなか解決方法が出てこなかったのでメモしておきます。

問題

Sparkをしばらく動かしていると急に特定のexecutorから反応が返ってこなくなる。特定のTASK(JOB, STAGE)が実行中のまま停止する。

原因

すみません不明です。。。

詳しく調査する前に後述の解決策を試してみたら上手くいったので、それで調査しなくなってしまいました。

職場の先輩社員曰くexecutorでFullGCが発生することが原因とのことです。

解決策

実はその(別のチームの)先輩社員が全く同じ現象にぶち当たっていて、以下のようなスライドを作成していました。

本当にあったApache Spark障害の話 from x1 ichi

助かります・・!

このような特定のTASKだけなぜか遅い・・・止まっている・・・というケースにはspark.speculationが有効なようです。

ここの設定をごらんください。

http://spark.apache.org/docs/latest/configuration.html

spark.speculationをtrueにすることで投機的実行が有効になります。これによって非常に時間がかかっているTASKは再起動されるようになります。

spark.speculation.intervalは再起動すべきかどうかのチェックを行う間隔です。これはデフォで良いでしょう。

spark.speculation.multiplierは再起動の判断を行う境界線です。他のタスクの実行時間の中央値にn倍した時間が境界線となります。デフォルトは1.5なので中央値よりも1.5倍遅いTASKは再起動されることになります。自分の場合は極端に遅い(停止している)TASKの再起動が目的で、頻度も少ないので、multiplierは5にしました。これなら無用な再起動は避けられるかと思います。

spark.speculation.quantileは再起動処理を有効にするタイミングの境界値です。デフォルトは0.75なので、1STAGE中で75%のTASKが完了したら再起動処理が有効になりはじめます。ここは特に変える必要はなさそうですね。

上記の設定を変更して試してみたところ、感覚的に2日に1度は停止していたものが全く停止しなくなりました。会社の先輩もspeculationで改善したとのこと。

みなさんもspeculationの利用を検討しましょう・・・!