Kafka:从保留主题 "compact" 中删除消息

Kafka: deleting messages from topics with retention "compact"

我正在尝试使用 Java 在 Kafka 中实现一个关于压缩主题的最小工作示例。我的压缩工作正常,但是当我按照 kafka 文档中的描述使用键和空值编写消息时,看不到删除发生。

使用的库版本:kafka-clients-0.10.0.0.jar

这里是 Java class 重现行为的要点: 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

当 运行 时,此 class 表明压缩有效 - 只有一条消息在主题上具有相同的键。但是,我仍然看到带有 "null" 值的消息,我认为应该删除它。

我可以看到更干净的线程 运行ning,产生如下输出: [2016-08-11 12:30:21,032] INFO Cleaner 0:将日志 compaction-test-0 中的第 15 段(最后修改时间为 2016 年 8 月 11 日星期四 12:29:52 CEST)清理为 0,保留删除。 (kafka.log.LogCleaner)

有谁知道为什么是 "retaining deletes"?我是否缺少任何相关的配置选项?我写 "null" 的方式正确吗?

非常感谢任何想法。提前致谢!

更新:在调查了有用的评论后,我升级到 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)

因为 "retaining deletes" 是由 val retainDeletes = old.lastModified > deleteHorizo​​nMs 并且相关段的最后修改日期似乎总是比删除范围稍晚,在我的最小示例中不会发生删除。

只是想知道现在如何调整设置或测试来处理这个...

此问题已在 0.10.1 中修复。看到这个 JIRA:https://issues.apache.org/jira/browse/KAFKA-4015