【问题标题】:Data still remains in Kafka topic even after retention time/size即使在保留时间/大小之后,数据仍保留在 Kafka 主题中
【发布时间】:2020-11-18 01:38:56
【问题描述】:

我们将log retention hours 设置为 1 小时,如下所示(之前设置为 72H)

使用下面的Kafka命令行工具,我们将kafka的retention.ms设置为1H。我们的目标是清除主题中早于 1H 的数据 - test_topic,因此我们使用了以下命令:

kafka-configs.sh --alter \
  --zookeeper localhost:2181  \
  --entity-type topics \
  --entity-name topic_test \
  --add-config retention.ms=3600000

还有

kafka-topics.sh --zookeeper localhost:2181 --alter \
  --topic topic_test \
  --config retention.ms=3600000

两个命令都运行没有错误。

但问题在于 Kafka 数据早于 1H 并且仍然存在!

实际上没有从主题topic_test分区中删除任何数据。我们有 HDP Kafka 集群版本 1.0x 和 ambari

我们不明白为什么主题数据 - topic_test 仍然存在?并且即使在我们按照已经描述的那样运行两个 cli 之后也没有减少

以下kafka cli有什么问题?

kafka-configs.sh --alter --zookeeper localhost:2181  --entity-type topics  --entity-name topic_test --add-config retention.ms=3600000

kafka-topics.sh --zookeeper localhost:2181 --alter --topic topic_test --config retention.ms=3600000

从 Kafka server.log 我们可以看到以下内容

2020-07-28 14:47:27,394] INFO Processing override for entityPath: topics/topic_test with config: Map(retention.bytes -> 2165441552, retention.ms -> 3600000) (kafka.server.DynamicConfigManager)
[2020-07-28 14:47:27,397] WARN retention.ms for topic topic_test is set to 3600000. It is smaller than message.timestamp.difference.max.ms's value 9223372036854775807. This may result in frequent log rolling. (kafka.server.TopicConfigHandler)

参考 - https://ronnieroller.com/kafka/cheat-sheet

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    日志清理器仅适用于非活动(有时也称为“旧”或“干净”)段。只要所有数据都适合其大小由segment.bytes 大小限制定义的活动(“脏”、“不干净”)段,就不会发生清理。

    配置cleanup.policy描述为:

    “删除”或“压缩”或两者兼有的字符串。 此字符串指定用于旧日志段的保留策略。默认策略(“删除”)将在达到保留时间或大小限制时丢弃旧段。 “compact”设置将启用主题的日志压缩。

    另外,segment.bytes 是:

    此配置控制日志的段文件大小。保留和清理总是一次完成一个文件,因此更大的段大小意味着更少的文件,但对保留的精细控制更小

    配置segment.ms也可用于引导删除:

    此配置控制 Kafka 强制日志滚动的时间段,即使段文件未满,以确保保留可以删除或压缩旧数据。

    由于默认为一周,您可能希望减少它以满足您的需要。

    因此,如果您想将主题的保留设置为例如你可以设置一小时:

    cleanup.policy=delete
    retention.ms=3600000
    segment.ms=3600000
    file.delete.delay.ms=1 (The time to wait before deleting a file from the filesystem)
    segment.bytes=1024
    

    注意:我指的不是retention.bytes。如上所述,segment.bytes 是一个非常不同的东西。另外,请注意log.retention.hours 是一个集群范围 的配置。因此,如果您计划为不同主题设置不同的保留时间,这将解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多