背景
在kafka的使用、测试过程中,可能老是会遇到想要删除某个主题的需求,但是由于对其内部机制不够了解,总是无法有效的删除主题。今天这篇文章详细讨论如何彻底的删除一个主题。
删除主题的前提
在kafka的broker端的配置参数中有这样一个参数:delete.topic.enable
,必须将它设置为true才能够删除kafka主题。这个参数的默认值是true。如果配置为false那么删除主题的命令将会被忽略。
kafka仅支持删除用户自定义主题,kafka的内置主题,如保存偏移量的主题__consumer_offset_
不允许被删除,如果执行删除命令会报错。
对于不存在的主题如果删除同样会抛出错误信息
使用删除主题命令的本质
使用kafka-topics.sh
脚本删除主题的行为本质上只是在zk中的/admin/delete_topics
路径下创建一个待删除主题的同名节点,以此标记该主题的待删除状态。所以我们可以在zk操作删除主题
当我们执行下面kafka删除主题的命令:
$>./bin/kafka-topics --delete --topic test-1 --zookeeper master:2181/kafka
再查询kafka的主题:
[root@localhost kafka_2.11-0.10.2.2]$> ./bin/kafka-topics.sh --list --zookeeper localhost:2181/kafka
__consumer_offsets
my-topic
test-1 - marked for deletion #发现主题仅仅是标记删除了
那么上面的删除命令到底发生了什么呢?
执行上述删除主题命令以后,会在zookeeper的/admin/delete_topics
路径下创建一个与删除主题同名的节点
[zk: localhost:2181(CONNECTED) 4] ls /kafka/admin/delete_topics
[test-1]
了解原理以后,我们在zk的该目录下手动创建要删除的节点,看一下会发生什么
[zk: localhost:2181(CONNECTED) 6] create /kafka/admin/delete_topics/test-2 ""
Created /kafka/admin/delete_topics/test-2 #手动创建要删除的节点成功
此时再次查询kafka的主题信息
[root@localhost kafka_2.11-0.10.2.2]$ ./bin/kafka-topics.sh --list --zookeeper localhost:2181/kafka
__consumer_offsets
my-topic
test-1 - marked for deletion
test-2 - marked for deletion #发现使用zk命令删除的节点与test-1是同样的效果
如何彻底删除一个kafka主题
通过上述说明我们已经知道使用kafka的删除命令是无法做到真正删除一个已经存在的主题的,那么该如何彻底删除主题呢?
一个kafka主题包含两部分内容:存储在zk中的元数据信息,和存储在磁盘log.dir
或者logs.dir
下的主题实际存储数据。
前者存储在zk的/kafka/config/topics/
和/kafka/brokers/topics
下,只需要删除zk中对应主题的节点即可(以test-1)为例
[zk: master:2181/kafka (CONNECTED) 1] rmr /config/topics/test-1
[zk: master:2181/kafka (CONNECTED) 2] rmr /brokers/topics/test-1
后者找到kafka配置的数据目录,将其删除即可
#该文件的目录配置在server.properties中
$>rm -rf /opt/modules/kafka-logs/test-1
执行上述操作以后,test-1主题的所有数据就被彻底删掉了,我们再进行查询发现已经没有test-1了
[root@localhost kafka_2.11-0.10.2.2]# ./bin/kafka-topics.sh --list --zookeeper localhost:2181/kafka
__consumer_offsets
my-topic
test-2 - marked for deletion
微信公众号:大数据报文