2015-07-29 2 views
8

Мне любопытно, если это абсолютно необходимо, чтобы приложение Spark streaming было изъято изящно, или он рискует вызвать дублирование данных через журнал записи вперед. В приведенном ниже сценарии я описываю последовательность шагов, в которых приемник очереди взаимодействует с очередью, требует подтверждения сообщений.Возможно ли реализовать надежный приемник, который поддерживает негибкое завершение работы?

  1. Приемник очереди Spark вытаскивает пакет сообщений из очереди.
  2. Приемник очереди Spark хранит пакет сообщений в журнале записи вперед.
  3. Приложение Spark прекращается до отправки ack в очередь.
  4. Приложение искры запускается снова.
  5. Сообщения в журнале записи вперед обрабатываются через приложение потоковой передачи.
  6. Приемник очереди Spark вытаскивает пакет сообщений из очереди, которые уже были показаны на шаге 1, потому что они не были подтверждены как полученные.
  7. ...

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

ответ

2

Нижняя линия: это зависит от вашей выходной операции.

Использование метода прямого API, который был introduced on V1.3, устраняет несоответствия между Spark Streaming и Kafka, поэтому каждая запись принимается Spark Streaming эффективно ровно один раз, несмотря на неудачи, поскольку смещения отслеживаются Spark Streaming внутри своих контрольных точек.

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

Для получения дополнительной информации о Direct API и способах его использования, зарегистрируйтесь this blog post от Databricks.