如何在Kafka中测试日志压缩是否有效?

tan*_*507 7 message-queue stream-compaction apache-kafka retention

我在Kafka 0.8.1.1中的server.properties文件中进行了更改,即在创建主题时添加log.cleaner.enable=true并启用cleanup.policy=compact了.现在,当我测试它时,我将以下消息推送到主题,其中包含以下内容(Key,Message).

  • 偏移量:1 - (123,abc);
  • 偏移量:2 - (234,def);
  • 抵消:3 - (345,ghi);
  • 抵消:4 - (123,已更改)

现在我用与早期输入相同的键推送第4条消息,但更改了消息.这里的日志压缩应该会出现.使用Kafka工具,我可以看到主题中的所有4个偏移.我怎么知道日志压缩是否有效?是否应删除先前的消息,或者在推送新消息时日志压缩工作正常.是否有做的任何事情log.retention.hourstopic.log.retention.hourslog.retention.size配置?这些配置在日志压缩中的作用是什么.PS - 我已经彻底浏览了Apache文档,但仍然不清楚.

小智 8

即使这个问题已经有几个月了,我也只是在为自己的问题做研究.我创建了一个最小的例子来看看压缩如何与Java一起工作,也许它对你也有帮助:

https://gist.github.com/anonymous/f78184eaeec3ee82b15182aec24a432a

此外,在查阅文档时,我在主题级别使用了以下配置,以便尽快启动压缩:

min.cleanable.dirty.ratio=0.01
cleanup.policy=compact
segment.ms=100
delete.retention.ms=100
Run Code Online (Sandbox Code Playgroud)

运行时,此类显示压缩有效 - 只有一条消息在主题上具有相同的键.

通过适当的设置,这可以在命令行上重现.

  • 每100毫秒强制执行一次分段滚动对于测试来说是可以的,但生产效率极低。默认值为6048000000毫秒(7天)。 (3认同)
  • 如果您最后一个`segment`(Topic-> Partition-> Segment)都没有填充,那么我将对此加以补充。假设segment.ms = 100,并且您在测试的前100毫秒内写入<`segement.bytes = 1GB`,那么您将只有1个数据段,并且数据将不会压缩。请确保您在比“ segment.ms”更长的时间内写入同一分区,或者将“ segment.bytes”设置为较低的值,以使并非所有数据都适合1个段。 (2认同)

tan*_*507 4

实际上,只有当日志数量达到很高的数量(例如100万)时,日志压缩才可见。所以,如果你有这么多数据,那就太好了。否则,使用配置更改,您可以将此限制减少到 100 条消息,然后您可以看到在具有相同键的消息中,只有最新的消息会存在,之前的消息将被删除。如果每次都有数据的完整快照,最好使用日志压缩,否则您可能会丢失具有相同关联键的先前日志,这可能很有用。

  • 如何通过 Kafka 提供的命令行工具来完成此操作? (5认同)