Kafka压缩以实现重复数据删除

时间:2019-01-21 21:34:18

标签: apache-kafka

我试图了解Kafka压缩的工作原理,并提出以下问题:kafka是否在启用压缩的情况下保证存储在主题中的消息的键的唯一性?

谢谢!

2 个答案:

答案 0 :(得分:5)

没有答案。

Kafka不保证在启用了主题保留的情况下存储的密钥的唯一性。

在卡夫卡,您有两种cleanup.policy类型:

  • delete-这意味着在配置的时间之后消息将不再可用。有几个属性可用于此:log.retention.hourslog.retention.minuteslog.retention.ms。默认情况下,log.retention.hours被设置为168。这意味着, 7天以上的邮件将被删除
  • compact-对于每个键,至少有一条消息可用。在某些情况下可以是一个,但在大多数情况下会更多。处理的压缩在后台定期运行。它复制日志部分,删除重复项,只保留最后一个值。

如果每个键只读取一个值,则必须使用{strong> Kafka Streams 中的KTable<K,V>抽象。

有关密钥和压缩的最新值的相关问题: Kafka only subscribe to latest message?

答案 1 :(得分:4)

看4个guarantees of kakfa compaction,第4个州:

  

从日志开头开始的所有使用者至少会看到   所有记录的最终状态。   此外,将看到已删除记录的所有删除标记,   如果消费者在一段时间内到达日志的开头   小于主题的delete.retention.ms设置(默认为24   小时)。换句话说:由于删除标记的删除发生了   与读取同时发生,消费者有可能错过删除   如果滞后时间超过delete.retention.ms。

因此,如果delete.retention.ms策略未保留主题的标题,则您将有多个键值。

据我了解,如果您设置24小时保留策略(delete.retention.ms=86400000),则对于24小时之前的所有邮件,您将为单个键具有唯一值。这是您的至少,但不仅限于此,因为在过去的24小时内可能还会收到相同密钥的其他消息。

因此,可以确保您会捕获至少一个,而不仅仅是最后一个,因为保留不会对最近的邮件起作用。

编辑。正如板球评论所指出的那样,即使您将删除保留属性设置为1天,log.roll.ms还是根据消息的时间戳定义何时关闭日志段的时间。由于最后一个段永远不会保留进行压缩,因此它成为第二个因素,使您无法仅将最后一个值用作已知密钥。如果您的主题始于T0,则T0+log.roll.ms之后的消息将位于打开的日志段中,因此不会进行压缩。