2017-09-14 58 views
1

有没有方法可以在不删除卡夫卡主题的情况下删除队列消息?
我想在激活使用者时删除队列消息。如何在不删除主题的情况下删除/清除卡夫卡排队邮件主题

我知道有几种方法,如:

  1. 重置保留时间

    $ ./bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic MyTopic --config retention.ms=1000

  2. 删除文件卡夫卡

    $ rm -rf /data/kafka-logs/<topic/Partition_name>

+0

您首先提到的保留时间技巧要好得多。第二种方式会导致复制主题出现问题,并导致主题的元数据与实际情况不一致。请注意,偏移号码不会回到零。 – dawsaw

回答

2

在0.11或更高版本中,您可以运行bin/kafka-delete-records.sh命令来标记要删除的消息。

https://github.com/apache/kafka/blob/trunk/bin/kafka-delete-records.sh

例如发布100个消息

seq 100 | ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mytest 

然后删除那些100个的消息90与新kafka-delete-records.sh 命令行工具

./bin/kafka-delete-records.sh --bootstrap-server localhost:9092 --offset-json-file ./offsetfile.json 

其中offsetfile.json包含

{"partitions": [{"topic": “mytest", "partition": 0, "offset": 90}], "version":1 } 

然后消耗从头开始的消息以验证消息中的90个确实标记为已删除。

./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic mytest --from-beginning 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
+0

感谢Hans的回复!这与我一直想要的非常接近。 你是否知道我是否可以在不知道有多少消息排队的情况下删除所有偏移量? 我可以通过编辑json来做到这一点吗? – Tachikoma

+0

是的,你可以删除所有消息。你也可以跳过使用这个工具,并查看源代码并编写自己的程序,直接调用相同的API在任何给定的偏移量(包括最新的偏移量)之前删除记录,或者可以通过时间戳查找偏移量以删除所有记录在特定时间之前。这个工具的使用应在卡夫卡1.0可以更好地记录的API,它是列于2017年10月 –

+0

我发现 {“分区”: [{ “主题”:“测试”, “分区”:0, “offset”:-1 }], “version”:1 } 可以清除主题中的所有消息。 我的下一个问题是,这会删除不同组的相同主题。 例如,如果主题“mytest”在消费者组“group1”中,并且“group2”正在观看主题“mytest”,则该工具将删除两个组中的所有消息。 有什么办法可以阻止它? – Tachikoma