Spark Streaming с Kafka: при восстановлении контрольной точки формы все данные обрабатываются только в одной микропакете

Я запускаю приложение Spark Streaming, которое читает данные из Kafka. Я активировал контрольные точки для восстановления работы в случае сбоя.

Проблема заключается в том, что, если приложение перестает работать, при перезапуске оно пытается выполнить все данные с точки сбоя только в одном микропакете. Это означает, что если микропакет обычно получает 10.000 событий от Kafka, если он выходит из строя и перезапускается через 10 минут, он должен обработать одну микропакет из 100.000 событий.

Теперь, если я хочу, чтобы восстановление с контрольными точками было успешным, я должен назначить гораздо больше памяти, чем обычно.

Это нормально, что при перезапуске Spark Streaming пытается выполнить все прошлые события из контрольной точки сразу, или я делаю что-то не так?

Большое спасибо.

1 ответ

Решение

Если вашему приложению трудно обработать все события в одном микропакете после восстановления после сбоя, вы можете предоставить spark.streaming.kafka.maxRatePerPartition Конфигурация - spark-conf, либо в spark-defaults.conf, либо внутри вашего приложения.

т. е. если вы считаете, что ваша система / приложение может безопасно обрабатывать 10 000 событий в минуту в секунду, а в теме kafka есть 2 раздела, добавьте эту строку в spark-defaults.conf

spark.streaming.kafka.maxRatePerPartition 5000

или добавьте его в свой код:

val conf = new SparkConf()
conf.set("spark.streaming.kafka.maxRatePerPartition", "5000")

Кроме того, я предлагаю вам установить это число немного выше и включить противодавление. Это попытается выполнить потоковую передачу данных со скоростью, которая не дестабилизирует ваше потоковое приложение.

conf.set("spark.streaming.backpressure.enabled","true")

обновление: произошла ошибка. Конфигурация указана для количества секунд в секундах, а не в минуту.

Другие вопросы по тегам