Apache spark “阿帕奇火花与卡夫卡”;正好一次;语义学

Apache spark “阿帕奇火花与卡夫卡”;正好一次;语义学,apache-spark,apache-kafka,Apache Spark,Apache Kafka,我有一个要输出到卡夫卡的数据帧。这可以通过使用卡夫卡制作人手动制作forEach来完成,也可以使用卡夫卡接收器(如果我开始使用Spark结构化流媒体)。 我希望在整个过程中实现一次语义,因此我希望确保不会将相同的消息提交两次 如果我使用Kafka producer,我可以通过Kafka属性启用幂等性,因为我看到这是使用序列号和ProducerId实现的,但我相信在阶段/任务失败的情况下,Spark重试机制可能会在Kafka上创建重复项,例如,如果工作节点失败,整个阶段将重试,并且将是一个全新的生

我有一个要输出到卡夫卡的数据帧。这可以通过使用卡夫卡制作人手动制作forEach来完成,也可以使用卡夫卡接收器(如果我开始使用Spark结构化流媒体)。
我希望在整个过程中实现一次语义,因此我希望确保不会将相同的消息提交两次

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

  • 查看kafka接收器的容错表,我可以看到: Kafka Sink至少支持一次语义,因此同一输出可以多次下沉

  • 使用Spark+卡夫卡制作人或卡夫卡接收器是否可以实现一次语义?

    如果可能,怎么做?

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

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

    我希望这篇文章将对您有所帮助:

    Kafka producer只支持一次语义:。您所描述的情况不同,是卡夫卡消费者(卡夫卡连接)将数据保存到另一个源中的情况。@L他描述的有点太快了。生产者也可以在重新启动后恰好失败一次。数据库的升级是幂等性,这在这里很有帮助。拥有数据的幂等消费者是一个可行的选择,但我想了解是否有可能在生产者方面保证这一点。根据我链接的Kafka文档,这是可能的(或者,如果使用producerIDs和序列号启用幂等性,则至少代理不会从同一个生产者写入两次消息)。我想了解的是kafka producer api将如何与Spark重试机制一起工作@BluePhantom你能解释一下“生产者在重新启动后也会失败一次”吗?卡夫卡确实支持一次处理。Spark Snapshot甚至进一步提高了保证