Spark结构化的流式确认消息

时间:2020-02-11 20:51:52

标签: scala apache-spark apache-kafka

我正在使用Spark Structured Streaming来读取Kafka主题(例如topic1),并使用SINK来写入另一个主题(topic1-result)。使用Sink写入另一个主题后,我看到消息没有从Topic1中删除。

// Subscribe to 1 topic
val df = spark
  .readStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1")
  .option("subscribe", "topic1")
  .load()

//SINK to another topic 
val ds = df
  .selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .writeStream
  .format("kafka")
  .option("kafka.bootstrap.servers", "host1:port1")
  .option("checkpointLocation", "/tmp/checkpoint1")
  .option("topic", "topic1-result")
  .start()

文档说我们不能对结构化流使用自动提交 enable.auto.commit: Kafka source doesn’t commit any offset.

但是如何确认消息并从主题(topic1)中删除已处理的消息

1 个答案:

答案 0 :(得分:2)

两个注意事项:

  1. 提交后,不会从Kafka中删除邮件。当您的使用者执行提交时,Kafka会增加该主题相对于已创建的使用者组的偏移量。但是消息会保留在主题中,具体取决于您为该主题配置的保留时间。

  2. 的确,Kafka源未进行提交,流在流式检查点目录中存储了指向下一条消息的偏移量。因此,当您重新启动流式传输时,它将消耗最后一个偏移量。