温馨提示: 要看高清无码套图, 请使用手机打开并单击图片放大查看.
1. 问题描述
使用 kafka-topics --delete 命令删除 topic 时并没有真正的删除, 而是把 topic 标记为:"marked for deletion", 导致重新创建相同名称的 Topic 时报错 "already exists".
2. 问题复现
1. 登录 Kafka 集群所在的服务器, 创建一个 test 的 topic
[root@cdh1 ~]# kafka-topics --create --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --replication-factor 1 --partitions 1 --topic test
2. 查看新创建的 topic
[root@cdh1 ~]# kafka-topics --list --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181
3. 通过如下命令删除新建的 topic
[root@cdh1 ~]# kafka-topics --delete --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --topic test
此处显示 "Topic test is marked for deletion"
4. 尝试重新创建一个 test 的 Topic
[root@cdh1 ~]# kafka-topics --create --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --replication-factor 1 --partitions 1 --topic test
提示该 Topic 已存在, 说明在第 3 步操作的删除并没有真正的将 Topic 删除.
3. 问题原因
默认情况下 Kafka 是禁用了删除 Topic 的操作, 所以在执行 Topic 删除的时候只是将删除的 Topic 标记为 "marked for deletion" 状态. 可以通过修改 Kafka 服务的配置参数启用.
4. 解决方法
4.1 方法 1
在 kafka 服务配置 delete.topic.enable=false 的情况下, 如果需要永久删除 topic 则需要做如下操作:
通过 kafka 命令删除相应的 topic
在 zookeeper 中删除相应的 topic
在 topic 所在的 broker 节点上删除 topic 的 log 数据
操作如下:
1. 查看 topic 的描述信息, 命令如下
kafka-topics --describe --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --topic test
上图标注部分为 topic 对应的数据存放节点
2. 通过 kafka 命令删除, 命令如下:
kafka-topics --delete --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --topic test
3. 通过 zookeeper 客户端删除 topic, 命令如下
- zookeeper-client -server ip-172-31-1-175.ap-southeast-1.compute.internal:2181
- ls /brokers/topics
- rmr /brokers/topics/test
注: 标红部分为 topic 的名称
4. 登录到第 1 步中列出的对应节点的 topic 的 log 数据目录, 此处我们 Kafka 的 log.dirs 目录配置为 / var/local/kakfa, 执行命令
[ec2-user@ip-172-31-9-186 data]$ sudo rm -rf test-0/
5. 验证是否生效
创建一个名称为 "test" 的 Topic, 可以正常创建
注意: 此处将 topic 为 test 的日志目录 (/var/local/kafka/test-0) 删除后, 新创建的 topic 为 test 的日志目录不存在, 重启 Kafka 服务后正常, 目录能正常显示.
4.2 方法 2
在 Kafka 服务已配置 delete.topic.enable=true 的情况下, 永久删除 topic 需要做如下操作:
使用 kafka 命令删除 topic
操作如下:
删除前数据查看:
kafka-topics --describe --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --topic test
各个数据节点的信息:
Zookeeper 信息:
2. 通过 kafka 命令删除需要删除的 topic, 命令如下
kafka-topics --delete --zookeeper ip-172-31-1-175.ap-southeast-1.compute.internal:2181 --topic test
3. 查看 Zookeeper 客户端 topic 信息
[zk: ip-172-31-1-175.ap-southeast-1.compute.internal:2181(CONNECTED) 9] ls /brokers/topics
4. 查看 brober 节点上 topic 的日志数据
5. 删除后成功后, 验证是否能创建名称为 test 的 Topic
注意:
如果 Kafka 服务配置了 delete.topic.enable=true, 直接通过命令行删除, 未能删除 Topic 则可以通过 zookeeper-client 来进行删除.
如果 Kafka 服务未配置 delete.topic.enable=true, 直接通过 delete 命令删除 topic, 删除时只会将 topic 标记为 "marked for deletion", 然后通过 zookeeper-client 进行删除是不会删除 topic 的 data.log 数据目录的, 需要将相应的 broker 服务器上的 data.log 目录下相应的 topic 目录删除, data.log 目录获取, 可以通过 CM 界面查看:
建议: Kafka 服务开启 delete.topic.enable=true, 开启方式如下:
开启后需要重启 Kafka 服务.
醉酒鞭名马, 少年多浮夸! 岭南浣溪沙, 呕吐酒肆下! 挚友不肯放, 数据玩的花!
温馨提示: 要看高清无码套图, 请使用手机打开并单击图片放大查看.
来源: http://www.bubuko.com/infodetail-2853918.html