清除Kafka主题


184

有没有办法清除kafka中的主题?

我将太大的消息推送到本地计算机上的kafka消息主题中,现在出现错误:

kafka.common.InvalidMessageSizeException: invalid message size

fetch.size这里增加s 并不理想,因为我实际上并不希望接受那么大的消息。

Answers:


359

暂时将主题的保留时间更新为一秒:

kafka-topics.sh --zookeeper <zkhost>:2181 --alter --topic <topic name> --config retention.ms=1000

在较新的Kafka版本中,您也可以使用 kafka-configs --entity-type topics

kafka-configs.sh --zookeeper <zkhost>:2181 --entity-type topics --alter --entity-name <topic name> --add-config retention.ms=1000

然后等待清除生效(大约一分钟)。清除后,恢复先前的retention.ms值。


8
这是一个很好的答案,但是您可以添加描述如何开始检查主题的当前retention.ms值吗?
Greg Dubicki 2015年

28
我不确定是否要检查当前配置,但我相信将其重置为默认值看起来像:bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic MyTopic --deleteConfig retention.ms
aspergillusOryzae 2015年

15
或取决于版本:--delete-config retention.ms
aspergillusOryzae

3
对于kafka v.0.9.0.0来说只是一个事实,它说:ubuntu @ ip-172-31-21-201:/opt/kafka/kafka_2.10-0.9.0.0-SNAPSHOT$ bin / kafka-topics.sh- -zookeeper localhost:2181 --alter-主题房间数据--config reserved.ms = 1000警告:不建议使用此脚本更改主题配置,并且在以后的发行版中可能会删除它。展望未来,请使用kafka-configs.sh来实现此功能
Alper Akture,2015年

54
从0.9.0开始,似乎不建议使用kafka-topics.sh更改配置。新选项是使用kafka-configs.sh脚本。 e.g. kafka-configs.sh --zookeeper <zkhost>:2181 --alter --entity-type topics --entity-name <topic name> --add-config retention.ms=1000 这也使您可以检查当前保留期,例如kafka-configs --zookeeper <zkhost>:2181 --describe --entity-type主题--entity-name <主题名称>
RHE

69

要清除队列,您可以删除主题:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test

然后重新创建它:

bin/kafka-topics.sh --create --zookeeper localhost:2181 \
    --replication-factor 1 --partitions 1 --topic test

14
切记delete.topic.enable=true在文件中添加行config/server.properties,如所提到的命令所显示的警告所述Note: This will have no impact if delete.topic.enable is not set to true.
Patrizio Bertoni,2015年

3
这并非总是瞬时的。有时,它只会标记为删除,而实际的删除将在以后发生。
Gaurav Khare,

48

以下是我删除名为的主题的步骤MyTopic

  1. 描述主题,不要使用经纪人ID
  2. 为列出的每个代理程序ID停止Apache Kafka守护程序。
  3. 连接到每个代理,然后删除主题数据文件夹,例如rm -rf /tmp/kafka-logs/MyTopic-0。对其他分区和所有副本重复以上操作
  4. 删除主题元数据:zkCli.sh然后rmr /brokers/MyTopic
  5. 为每台已停止的计算机启动Apache Kafka守护程序

如果您错过了第3步,那么Apache Kafka将继续报告该主题为当前状态(例如,如果您运行kafka-list-topic.sh)。

使用Apache Kafka 0.8.0进行了测试。


2
在0.8.1 ./zookeeper-shell.sh localhost:2181./kafka-topics.sh --list --zookeeper localhost:2181
pdeschen 2014年

可以使用zookeeper-client代替zkCli.sh(在Cloudera CDH5上试用)
Martin Tapp 2014年

1
这将删除主题,而不是其中的数据。这要求代理停止。充其量只是一个hack。史蒂文·阿普亚卡德(Steven Appleyard)的回答确实是绝对最好的。
杰夫·马斯

1
这是当时编写它的唯一方法。
Thomas Bratt

2
为我在Kafka 0.8.2.1上工作,尽管zookeeper中的topis在/ brokers / topics / <此处为主题名称下
codecraig

43

尽管接受的答案是正确的,但该方法已被弃用。现在应通过进行主题配置kafka-configs

kafka-configs --zookeeper localhost:2181 --entity-type topics --alter --add-config retention.ms=1000 --entity-name MyTopic

通过此方法设置的配置可以与命令一起显示

kafka-configs --zookeeper localhost:2181 --entity-type topics --describe --entity-name MyTopic

2
还值得添加:kafka-configs --zookeeper localhost:2181 --entity-type topics --alter --delete-config retention.ms --entity-name MyTopic
NoBrainer

38

快速入门示例在Kafka 0.8.2中进行了测试:首先,在config文件夹下的server.properties文件中添加一行:

delete.topic.enable=true

然后,您可以运行以下命令:

bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic test

6

从kafka 1.1开始

清除主题

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name tp_binance_kline --add-config retention.ms=100

请等待1分钟,以确保kafka清除主题以删除配置,然后再使用默认值

bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name tp_binance_kline --delete-config retention.ms

1
我认为您还有一个额外的箭头。在我的车上,我得以跑步bin/kafka-configs.sh --zookeeper localhost:2181 --alter --entity-type topics --entity-name my-topic --add-config rentention.ms=100
Will

4

kafka没有清除/清除主题(队列)的直接方法,但是可以通过删除该主题并重新创建来实现。

首先确保sever.properties文件具有,如果没有添加 delete.topic.enable=true

然后,删除主题 bin/kafka-topics.sh --zookeeper localhost:2181 --delete --topic myTopic

然后再次创建它。

bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic myTopic --partitions 10 --replication-factor 2

4

有时,如果群集饱和(分区过多,或者使用加密的主题数据,或者使用SSL,或者控制器位于错误的节点上,或者连接不稳定),清除该主题将花费很长时间。

我遵循这些步骤,特别是如果您使用的是Avro。

1:使用kafka工具运行:

bash kafka-configs.sh --alter --entity-type topics --zookeeper zookeeper01.kafka.com --add-config retention.ms=1 --entity-name <topic-name>

2:在架构注册表节点上运行:

kafka-avro-console-consumer --consumer-property security.protocol=SSL --consumer-property ssl.truststore.location=/etc/schema-registry/secrets/trust.jks --consumer-property ssl.truststore.password=password --consumer-property ssl.keystore.location=/etc/schema-registry/secrets/identity.jks --consumer-property ssl.keystore.password=password --consumer-property ssl.key.password=password --bootstrap-server broker01.kafka.com:9092 --topic <topic-name> --new-consumer --from-beginning

3:主题为空后,将主题保留时间恢复为原始设置。

bash kafka-configs.sh --alter --entity-type topics --zookeeper zookeeper01.kafka.com --add-config retention.ms=604800000 --entity-name <topic-name>

希望这对某人有所帮助,因为它不容易宣传。


注意:kafka-avro-console-consumer没有必要
OneCricketeer

4

更新:此答案与Kafka 0.6有关。对于Kafka 0.8及更高版本,请参见@Patrick的回答。

是的,停止kafka并从相应的子目录中手动删除所有文件(在kafka数据目录中很容易找到它)。kafka重新启动后,主题将为空。


这需要关闭代理,并且充其量是hack。史蒂文·阿普亚卡德(Steven Appleyard)的回答确实是绝对最好的。
杰夫·马斯

@MaasSql我同意。:)这个答案已有两年历史,大约是0.6版。稍后将实现“更改主题”和“删除主题”功能。
2015年

史蒂文·阿普亚卡德(Steven Appleyard)的答案与这一答案一样顽强。
Banjocat '16

让应用程序以受支持的方式删除其自己的数据要比关闭该应用程序并删除您认为所有数据文件然后再将其重新打开要容易得多。
尼克

3

最简单的方法是将单个日志文件的日期设置为早于保留期限。然后,经纪人应清理它们并在几秒钟内为您删除它们。这具有几个优点:

  1. 无需关闭代理,这是运行时操作。
  2. 避免了无效的偏移量异常的可能性(更多内容请参见下文)。

根据我对Kafka 0.7.x的经验,删除日志文件并重新启动代理可能会导致某些使用者使用无效的偏移量异常。之所以会发生这种情况,是因为代理将偏移量重新设置为零(在没有任何现有日志文件的情况下),并且先前从该主题消费的使用者将重新连接以请求特定的[一次有效]偏移量。如果此偏移量恰好落在新主题日志的范围之外,则不会造成任何损害,并且使用者可以在开头或结尾处恢复。但是,如果偏移量落在新主题日志的范围内,则代理将尝试获取消息集,但会失败,因为偏移量与实际消息不匹配。

可以通过清除Zookeeper中针对该主题的消费者补偿来缓解这种情况。但是,如果您不需要原始主题,而只想删除现有内容,则与停止代理,删除主题日志并清除某些Zookeeper节点相比,只需“触摸”几条主题日志就容易得多,并且更加可靠。 。


如何“将单个日志文件的日期设置为早于保留期限”?谢谢
bylijinnan

3

托马斯的建议很好,但不幸的是,zkCli在旧版本的Zookeeper中(例如3.3.6)似乎不支持rmr。例如,将现代Zookeeper中的命令行实现与版本3.3进行比较

如果您遇到的是Zookeeper的旧版本,一种解决方案是使用客户端库(例如用于Python的zc.zk)。对于不熟悉Python的人,您需要使用pipeasy_install进行安装。然后启动一个Python shell(python),您可以执行以下操作:

import zc.zk
zk = zc.zk.ZooKeeper('localhost:2181')
zk.delete_recursive('brokers/MyTopic') 

甚至

zk.delete_recursive('brokers')

如果要从Kafka中删除所有主题。


2

要使用您的应用程序组清除特定主题的所有消息(GroupName应与应用程序kafka组名相同)。

./kafka-path/bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic topicName --from-beginning --group application-group


这种方法存在问题(在0.8.1.1中进行了测试)。如果应用程序订阅了两个(或多个)主题:topic1和topic2,并且控制台使用者清除了topic1,则不幸的是,它还删除了topic2的不相关的使用者偏移量,这导致重播topic2中的所有消息。
jsh 2015年

2

在@steven appleyard回答之后,我在Kafka 2.2.0上执行了以下命令,它们为我工作。

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --describe

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --alter --add-config retention.ms=1000

bin/kafka-configs.sh --zookeeper localhost:2181 --entity-type topics --entity-name <topic-name> --alter --delete-config retention.ms

这似乎重复了其他答案
OneCricketeer

2

这里有很多很棒的答案,但是在其中,我找不到关于docker的答案。我花了一些时间弄清楚在这种情况下使用代理容器是错误的(显然!!!)

## this is wrong!
docker exec broker1 kafka-topics --zookeeper localhost:2181 --alter --topic mytopic --config retention.ms=1000
Exception in thread "main" kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
        at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:258)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at kafka.utils.CoreUtils$.inLock(CoreUtils.scala:253)
        at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:254)
        at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:112)
        at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1826)
        at kafka.admin.TopicCommand$ZookeeperTopicService$.apply(TopicCommand.scala:280)
        at kafka.admin.TopicCommand$.main(TopicCommand.scala:53)
        at kafka.admin.TopicCommand.main(TopicCommand.scala)

我应该使用zookeeper:2181而不是--zookeeper localhost:2181根据我的撰写文件

## this might be an option, but as per comment below not all zookeeper images can have this script included
docker exec zookeper1 kafka-topics --zookeeper localhost:2181 --alter --topic mytopic --config retention.ms=1000

正确的命令是

docker exec broker1 kafka-configs --zookeeper zookeeper:2181 --alter --entity-type topics --entity-name dev_gdn_urls --add-config retention.ms=12800000

希望它可以节省别人的时间。

另外,请注意,消息不会立即删除,而是会在日志段关闭时发生。


您可以执行进入经纪人就好。问题是localhost:2181...例如,您误解了Docker网络功能。另外,并非所有的Zookeeper容器都具有kafka-topics,因此最好不要那样使用。最新的Kafka安装允许--bootstrap-servers更改主题,而不是--zookeeper
OneCricketeer

1
但是,进入Zookeeper容器的exec似乎是错误的。you can use --zookeeper zookeeper:2181来自Kafka容器是我的观点。甚至grep从server.properties文件中
删除

@ cricket_007嘿,非常感谢,我更正了答案,让我知道那里是否仍然有问题
Vladimir Semashkin

1

由于大小而无法添加为注释:不知道这是否是正确的,除了更新tention.ms和retention.bytes外,但我注意到主题清理策略应为“删除”(默认),如果为“紧凑”,它将保留更长的消息,即,如果消息“紧凑”,则还必须指定delete.retention.ms

./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics
Configs for topics:test-topic-3-100 are retention.ms=1000,delete.retention.ms=10000,cleanup.policy=delete,retention.bytes=1

还必须监视最早/最新的偏移量,以确认是否成功完成,也可以检查du -h / tmp / kafka-logs / test-topic-3-100- *

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list "BROKER:9095" --topic test-topic-3-100 --time -1 | awk -F ":" '{sum += $3} END {print sum}' 26599762

./bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list "BROKER:9095" --topic test-topic-3-100 --time -2 | awk -F ":" '{sum += $3} END {print sum}' 26599762

另一个问题是,你必须得到当前配置第一,所以你要记得还原后删除成功: ./bin/kafka-configs.sh --zookeeper localhost:2181 --describe --entity-name test-topic-3-100 --entity-type topics


1

清除主题的另一种方法是手动的:

在经纪人中:

  1. 停止卡夫卡经纪人
    sudo service kafka stop
  2. 删除所有分区日志文件(应在所有代理上完成)
    sudo rm -R /kafka-storage/kafka-logs/<some_topic_name>-*

在动物园管理员中:

  1. 运行Zookeeper命令行界面
    sudo /usr/lib/zookeeper/bin/zkCli.sh
  2. 使用zkCli删除主题元数据
    rmr /brokers/topic/<some_topic_name>

在经纪人中再次:

  1. 重新启动经纪人服务
    sudo service kafka start

您需要停止并使用副本从每个代理中删除文件,这意味着这样做可能会使客户端宕机
OneCricketeer

1
没错,这只是让您实际了解Kafka存储和管理某些内容的位置。但是这种强力方法绝对不适用于生产运行系统。
Danny Mor,

1
./kafka-topics.sh --describe --zookeeper zkHost:2181 --topic myTopic

这应该给retention.ms配置。然后,您可以使用上述alter命令将其更改为1秒(之后又恢复为默认值)。

Topic:myTopic   PartitionCount:6        ReplicationFactor:1     Configs:retention.ms=86400000

1

从Java,使用new AdminZkClient而不是不赞成使用的AdminUtils

  public void reset() {
    try (KafkaZkClient zkClient = KafkaZkClient.apply("localhost:2181", false, 200_000,
        5000, 10, Time.SYSTEM, "metricGroup", "metricType")) {

      for (Map.Entry<String, List<PartitionInfo>> entry : listTopics().entrySet()) {
        deleteTopic(entry.getKey(), zkClient);
      }
    }
  }

  private void deleteTopic(String topic, KafkaZkClient zkClient) {

    // skip Kafka internal topic
    if (topic.startsWith("__")) {
      return;
    }

    System.out.println("Resetting Topic: " + topic);
    AdminZkClient adminZkClient = new AdminZkClient(zkClient);
    adminZkClient.deleteTopic(topic);

    // deletions are not instantaneous
    boolean success = false;
    int maxMs = 5_000;
    while (maxMs > 0 && !success) {
      try {
        maxMs -= 100;
        adminZkClient.createTopic(topic, 1, 1, new Properties(), null);
        success = true;
      } catch (TopicExistsException ignored) {
      }
    }

    if (!success) {
      Assert.fail("failed to create " + topic);
    }
  }

  private Map<String, List<PartitionInfo>> listTopics() {
    Properties props = new Properties();
    props.put("bootstrap.servers", kafkaContainer.getBootstrapServers());
    props.put("group.id", "test-container-consumer-group");
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
    Map<String, List<PartitionInfo>> topics = consumer.listTopics();
    consumer.close();

    return topics;
  }

您不需要Zookeeper。使用AdminClientKafkaAdminClient
OneCricketeer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.