Предотвращение повторной обработки данных во время обновлений приложения Spark Structured Streaming

Я использую структурированный поток с Spark 2.2. Мы используем Kafka в качестве нашего источника и используем контрольные точки для восстановления после сбоев, и e2e гарантирует только один раз. Я хотел бы получить дополнительную информацию о том, как обрабатывать обновления приложения, когда происходит изменение операций с состоянием и / или схемы вывода.

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

Я хочу избежать повторной обработки данных в недавно развернутом обновленном приложении.

Один из способов, который я могу придумать, состоит в том, чтобы приложение продолжало записывать смещения во что-то помимо каталога контрольных точек, например, в zookeeper/hdfs, И тогда, при обновлении приложения, я командую Кафкой readstream() начать чтение со смещений, сохраненных в этом новом месте (zookeeper/hdfs) - поскольку обновленное приложение не может читать из каталога контрольных точек, который теперь считается несовместимым.

Итак, пара вопросов:

  1. Является ли вышеуказанное решение допустимым?
  2. Если да, как я могу автоматизировать обнаружение того, перезапускается ли приложение из-за сбоя / обслуживания или из-за изменений кода в операциях с состоянием и / или выходной схеме?

Любое руководство, пример или источник информации приветствуется.

0 ответов

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