Apache Spark和Kafka的语义“恰好一次”

时间:2020-01-27 14:21:59

标签: apache-spark apache-kafka

我有一个要输出到Kafka的数据框。可以使用Kafka生产者手动执行forEach操作,也可以使用Kafka接收器(如果我开始使用Spark结构化流式传输)。
我想在整个过程中实现一次语义,所以我想确保不会将同一条消息提交两次。

  1. 如果我使用Kafka生产者,则可以通过Kafka属性启用幂等性,因为我已经看到这是使用序列号和producersId实现的,但是我相信在阶段/任务失败的情况下,Spark会重试这种机制可能会在Kafka上创建重复项,例如,如果工作程序节点发生故障,将重试整个阶段,并且整个新生产者将推送导致重复项的消息吗?

  2. 看到卡夫卡水槽here的容错表,我可以看到: enter image description here Kafka Sink支持至少一次语义,因此同一输出可以被沉没一次以上。

是否可以通过Spark + Kafka生产者或Kafka接收器实现一次语义精确化?
如果可能的话,怎么办?

1 个答案:

答案 0 :(得分:1)

Kafka不支持一次语义。它们仅保证至少一次语义。他们只是提出如何避免重复消息。如果您的数据具有唯一密钥并存储在数据库或文件系统等中,则可以避免重复消息。

例如,将数据下沉到HBase中,每条消息都有一个唯一的键作为HBase行键。当它收到具有相同密钥的消息时,该消息将被覆盖。

我希望本文对您有所帮助: https://www.confluent.io/blog/apache-kafka-to-amazon-s3-exactly-once/

相关问题