【问题标题】:Apache Spark and Kafka "exactly once" semanticsApache Spark 和 Kafka “恰好一次”语义
【发布时间】:2020-05-12 22:30:57
【问题描述】:

我有一个要输出到 Kafka 的数据框。这可以通过使用 Kafka 生产者手动执行 forEach 来完成,或者我可以使用 Kafka 接收器(如果我开始使用 Spark 结构化流)。
我想在整个过程中实现一次语义,所以我想确保我永远不会两次提交相同的消息。

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

  2. 查看 kafka sink here 的容错表我可以看到: Kafka Sink 支持 at-least-once 语义,因此可以多次接收相同的输出。

是否可以使用 Spark + Kafka 生产者或 Kafka 接收器实现仅一次语义?
如果可以,怎么做?

【问题讨论】:

    标签: apache-spark apache-kafka


    【解决方案1】:

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

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

    我希望这篇文章会有所帮助: https://www.confluent.io/blog/apache-kafka-to-amazon-s3-exactly-once/

    【讨论】:

    • Kafka 生产者只支持一次语义:confluent.io/blog/…。您描述的情况不同,是 kafka 消费者(kafka 连接)将数据保存在另一个源中的情况。
    • @LFilips 有点太快了,他描述了两者。 Producer 也可以在重启后只失败一次。
    • 对数据库的 upsert 是幂等性,这在这里有帮助。
    • 拥有我的数据的幂等消费者是一个可行的选择,但我想了解是否可以在生产者方面保证这一点。根据我链接的Kafka文档是可能的(或者如果使用producerID和序列号启用幂等性,至少代理不会从同一个生产者写入两次消息)。我想了解的是 kafka producer api 将如何与 Spark 重试机制一起运行。 @thebluephantom 你能解释一下这个“生产者在重启后也可以只失败一次”吗?
    • Kafka 确实只支持一次处理。 Spark 快照进一步保证
    猜你喜欢
    • 2020-10-04
    • 2017-01-14
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2017-01-21
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多