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")
обновление: произошла ошибка. Конфигурация указана для количества секунд в секундах, а не в минуту.