【发布时间】:2020-05-12 22:30:57
【问题描述】:
我有一个要输出到 Kafka 的数据框。这可以通过使用 Kafka 生产者手动执行 forEach 来完成,或者我可以使用 Kafka 接收器(如果我开始使用 Spark 结构化流)。
我想在整个过程中实现一次语义,所以我想确保我永远不会两次提交相同的消息。
如果我使用 Kafka 生产者,我可以通过 Kafka 属性启用幂等性,因为我看到这是使用序列号和生产者 ID 实现的,但我相信在阶段/任务失败的情况下 Spark 重试机制可能会在 Kafka 上创建重复,例如,如果一个工作节点发生故障,整个阶段将被重试,并且将是一个全新的生产者推送导致重复的消息?
查看 kafka sink here 的容错表我可以看到: Kafka Sink 支持 at-least-once 语义,因此可以多次接收相同的输出。
是否可以使用 Spark + Kafka 生产者或 Kafka 接收器实现仅一次语义?
如果可以,怎么做?
【问题讨论】: