我正在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的内容。重复执行会导致同一组消息一遍又一遍地返回。
我应该怎么做才能使邮件在阅读后从“主题”中删除?
答案 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
的更多信息