我正在尝试使用Java在Kafka上实现压缩主题的最小工作示例。我使压缩工作运行良好,但是当我用kafka文档中描述的使用密钥和空值编写消息时,看不到删除。
使用的库版本:kafka-clients-0.10.0.0.jar
以下是重现行为的Java类的要点: https://gist.github.com/anonymous/f78184eaeec3ee82b15182aec24a432a
此外,在查阅文档后,我在主题级别使用了以下配置,以便尽快启动压缩:
min.cleanable.dirty.ratio=0.01
cleanup.policy=compact
segment.ms=100
delete.retention.ms=100
在server.properties端,只是为了确定:
log.retention.check.interval.ms=100
log.cleaner.delete.retention.ms=100
log.cleaner.enable=true
log.cleaner.min.cleanable.ratio=0.01
运行时,此类显示压缩有效 - 只有一条消息在主题上具有相同的键。但是,我仍然看到带有“null”值的消息,在我看来应该已删除。
我可以看到更干净的线程正在运行,产生的输出如下: [2016-08-11 12:30:21,032] INFO Cleaner 0:将log compaction-test-0(最后修改时间为8月11日12:29:52 CEST 2016)中的段15清除为0,保留删除。 (kafka.log.LogCleaner)
有谁知道为什么它会“保留删除”?我错过了任何相关的配置选项吗?我是否以正确的方式写“空”?
非常感谢任何想法。提前谢谢!
更新:在调查了有用的评论之后,我升级到了0.10.0.1并在清洁日志中找到了以下输出:
[2016-08-15 12:44:57,412] INFO Cleaner 0: Cleaning log compaction-test-0 (discarding tombstones prior to Mon Aug 15 12:44:40 CEST 2016)... (kafka.log.LogCleaner)
[2016-08-15 12:44:57,412] INFO Cleaner 0: Cleaning segment 0 in log compaction-test-0 (last modified Mon Aug 15 12:44:41 CEST 2016) into 0, retaining deletes. (kafka.log.LogCleaner)
[2016-08-15 12:44:57,412] INFO Cleaner 0: Cleaning segment 15 in log compaction-test-0 (last modified Mon Aug 15 12:44:41 CEST 2016) into 0, retaining deletes. (kafka.log.LogCleaner)
[2016-08-15 12:44:57,413] INFO Cleaner 0: Cleaning segment 16 in log compaction-test-0 (last modified Mon Aug 15 12:44:56 CEST 2016) into 0, retaining deletes. (kafka.log.LogCleaner)
由于“保留删除”设置为 val retainDeletes = old.lastModified> deleteHorizonMs 并且有问题的段的最后修改日期似乎总是比删除范围稍晚,在我的最小示例中不会发生删除。
只是想知道如何调整设置或测试以解决这个问题......