当Spark消费者从中读取Kafka Topic时不会刷新

时间:2019-01-11 22:49:55

标签: apache-spark apache-kafka spark-structured-streaming

我正在Spark中使用以下消费者代码来读取Kafka主题:

val df = spark
  .read
  .format("kafka")
  .option("kafka.bootstrap.servers", kafkaBrokers)
  .option("subscribe", topicName)
  .load()
df.selectExpr("CAST(key AS STRING)", "CAST(value AS STRING)")
  .as[(String, String)]

代码按预期方式从Topic读取,但是由于读取的结果,并未刷新Topic的内容。重复执行会导致同一组消息一遍又一遍地返回。

我应该怎么做才能使邮件在阅读后从“主题”中删除?

2 个答案:

答案 0 :(得分:0)

Kafka在使用时不会删除主题消息

您的Spark代码属于Kafka 消费者组的一部分,它需要确认已读取一条消息,并提交这些偏移量,我相信Spark默认情况下会定期自动执行此操作,但是您可以通过将enable.auto.commit的选项设置为false来禁用此功能,强烈建议您这样做,因为您将需要控制Spark是否成功处理了记录。

Checkpointing或将偏移量提交到持久性存储是some ways,以在任务重新启动/失败时保留偏移量,而不重新读取相同的数据

答案 1 :(得分:0)

正如crikcet_007所述,Kafka在使用后不会删除日志。您可以使用基于大小的策略或基于时间的设置来管理Kafka中的日志保留。

log.retention.bytes-删除日志之前的最大大小

log.retention.hours-在删除日志文件之前保留其小时数

log.retention.minutes-保留日志文件的分钟数

log.retention.ms-保留日志文件的毫秒数

您可以详细了解这些参数here

用于处理日志保留的其他机制之上是日志压缩。通过设置以下参数,您可以管理日志压缩

log.cleanup.policy

log.cleaner.min.compaction.lag.ms

您可以了解有关here

的更多信息