Вам нужно будет управлять уникальные ключи вручную, но при условии, что подойти к нему является возможно, когда не используя
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 необходимо будет управлять.