2016-06-18 4 views
2

Ищу обрабатывать элементы на очереди (Кафку или Amazon KINESIS) и иметь несколько операций, которые необходимо выполнить для каждого элемента, например:Множественные потребители точно однократной обработки с Apache Спарк Потоковое

  • Написать что в кластер HDFS
  • Вызвать API для отдыха
  • Запустить уведомление о слабине.

В каждой из этих операций я ожидаю однозначно семантического, это достижимо в Apache Spark и как?

ответ

1

Вам нужно будет управлять уникальные ключи вручную, но при условии, что подойти к нему является возможно, когда не используя

KafkaUtils.createDirectStream 

от искры Docs http://spark.apache.org/docs/latest/streaming-kafka-integration.html:

подхода 2: Прямой подход (Нет Приемники)

каждая запись получена Spark Streaming эффективно ровно один раз, несмотря на неудачи.

И вот требование idempotency - так, например. сохранение уникального ключа каждого сообщения в Postgres:

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

Вот идея подобного кода вам нужно будет управлять уникальными ключами (от http://blog.cloudera.com/blog/2015/03/exactly-once-spark-streaming-from-apache-kafka/):

stream.foreachRDD { rdd => 
    rdd.foreachPartition { iter => 
    // make sure connection pool is set up on the executor before writing 
    SetupJdbc(jdbcDriver, jdbcUrl, jdbcUser, jdbcPassword) 

    iter.foreach { case (key, msg) => 
     DB.autoCommit { implicit session => 
     // the unique key for idempotency is just the text of the message itself, for example purposes 
     sql"insert into idem_data(msg) values (${msg})".update.apply 
     } 
    } 
    } 
} 

Уникальный за сообщение ID необходимо будет управлять.

0

Точно один раз является побочным эффектом, по крайней мере, после обработки семантики, когда операции являются идемпотентными. В вашем случае, если все 3 операции являются идемпотентными, то вы можете получить ровно один раз семантический. Другой способ получить ровно один раз семантический - это обернуть все 3 операции и резервное хранилище Kafka в одной транзакции, что невозможно.

https://pkghosh.wordpress.com/2016/05/18/exactly-once-stream-processing-semantics-not-exactly/

Смежные вопросы