Spark Streaming (Kinesis) ではdynamic resource allocationは使えない


こんにちは、@s_tsukaです。

Apache SparkのStreamingアプリを開発したときにはまったトラブルについてメモしておきます。

問題

Spark streamingでKinesisを扱うアプリを書いて動かすと、StreamのReceiverが規定の数まで正しく起動しない。

executorの数がなんかおかしい。

挙動が不安定で、Kinesis streamのデータを正しく消化できない。

原因

Dynamic resource allocationがONになっているため。

Optimize Spark-Streaming to Efficiently Process Amazon Kinesis Streams

Spark streamingアプリの場合データを受信するreceiverが起動しますが、ここのAWS blogの通り、receiverはDynamic resource allocationに対応していないです。そのため、とりあえず動きはしますが、receiverに対するexecutorの割り当て?あたりが不必要に動的に変更されてしまいます。結果、Kinesis側から正しくデータを取得できない状態になってしまいます。

Amazon EMRとかデフォルトでdynamic resource allocation ONになっているので注意が必要ですね。

解決

spark-submitするときに、—num-executorsを使って、executor数を固定する。

これをやればdynamicは無効になりますので安定して動くと思います。

このとき、Kinesisのshard数よりも、—num-executorsで指定したマシンの数*core数が大きくなるようにします。仮にshard数が16で—num-executorsが3、core数が1台につき4の場合、shardを処理しきれなくてreceiverが正しく動けないと思います。多分Receivers: 12/16 active とかになるんじゃないかな。とにかくこの辺もあわせてご注意ください。

以上です!快適なSpark Streaming(Kinesis)ライフをお送りください!