
# 删除Kafka Topic时发现无法删除
#### 问题描述
在使用以下Kafka客户端命令删除Topic时（例如Topic名称为"test"），发现Topic无法被删除。
```
kafka-topics.sh --delete --topic test --zookeeper x.x.x.x:port/kafka
```
#### 可能原因
- Kafka服务异常，Kafka部分节点处于停止或故障状态。具体处理步骤请参考[Kafka节点状态异常]。
- 客户端命令连接ZooKeeper地址错误，报错"ZkTimeoutException"。具体处理步骤请参考[客户端命令连接ZooKeeper地址错误]。
- Kafka服务端配置禁止删除（"delete.topic.enable"参数值配置为"false"）。具体处理步骤请参考[Kafka服务端配置禁止删除]。
- Kafka配置自动创建（"auto.create.topics.enable"参数值配置为"true"），且Producer未停止。具体处理步骤请参考[Kafka配置自动创建，且Producer未停止]。
 
#### 处理步骤
出现该问题的可能原因及处理步骤有以下几种：
#### Kafka节点状态异常
- **原因分析**
  Topic进行删除必须保证该Topic的所有Partition所在的Broker必须处于正常状态。
  1. 登录MRS集群Manager页面，选择"集群 \> 服务 \> Kafka \> 实例"，查看Broker实例状态。 发现其中一个Broker处于停止或者故障状态。
     
  
  2. 客户端查询命令：
     ```
     kafka-topics.sh --describe -topic test --zookeeper x.x.x.x:port/kafka
     ```
     ![](https://support.huaweicloud.com/trouble-mrs/zh-cn_image_0000002488287330.png "点击放大")
     进入RunningAsController节点日志目录，在controller.log发现marked ineligible for deletion。
     ```
     2016-03-10 11:11:17,989 | INFO  | [delete-topics-thread-3] | [delete-topics-thread-3], Handling deletion for topics test | kafka.controller.TopicDeletionManager$DeleteTopicsThread (Logging.scala:68)
     2016-03-10 11:11:17,990 | INFO  | [delete-topics-thread-3] | [delete-topics-thread-3], Not retrying deletion of topic test at this time since it is marked ineligible for deletion | kafka.controller.TopicDeletionManager$DeleteTopicsThread (Logging.scala:68)
     ```
     
   
- **处理步骤**
  1. 启动停止的Broker实例。
  
  2. 执行客户端查询命令，无Topic:test。
     ```
     kafka-topics.sh --list --zookeeper x.x.x.x:port/kafka
     ```
     
  
  3. 进入RunningAsController节点日志目录，在controller.log发现Deletion of topic test successfully，表示已删除成功。
     ```
     2016-03-10 11:17:56,463 | INFO  | [delete-topics-thread-3] | [Partition state machine on Controller 3]: Invoking state change to NonExistentPartition for partitions [test,4],[test,1],[test,8],[test,2],[test,5],[test,9],[test,7],[test,6],[test,0],[test,3] | kafka.controller.PartitionStateMachine (Logging.scala:68)
     2016-03-10 11:17:56,726 | INFO  | [delete-topics-thread-3] | [delete-topics-thread-3], Deletion of topic test successfully completed | kafka.controller.TopicDeletionManager$DeleteTopicsThread (Logging.scala:68)
     ```
     
   
 
#### 客户端命令连接ZooKeeper地址错误
- **原因分析**
  执行客户端命令后，打印ZkTimeoutException异常，例如报错如下：
  ```
  [2016-03-09 10:41:45,773] WARN Can not get the principle name from server 192.168.234.231 (org.apache.zookeeper.ClientCnxn)
  Exception in thread "main" org.I0Itec.zkclient.exception.ZkTimeoutException: Unable to connect to zookeeper server within timeout: 30000
  at org.I0Itec.zkclient.ZkClient.connect(ZkClient.java:880)
  at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:98)
  at org.I0Itec.zkclient.ZkClient.<init>(ZkClient.java:84)
  at kafka.admin.TopicCommand$.main(TopicCommand.scala:51)
  at kafka.admin.TopicCommand.main(TopicCommand.scala)
  ```
  
- **处理步骤**
  Kafka客户端连接ZooKeeper服务超时。检查客户端到ZooKeeper的网络连通性。
  1. 通过登录Manager界面，选择"集群 \> 服务 \> ZooKeeper \> 实例"，查看ZooKeeper角色实例的业务IP地址。
  
  2. 发现客户端命令中的IP地址配置错误，修改客户端命令中ZooKeeper地址。
  
  3. 再次执行delete操作。
   
 
#### Kafka服务端配置禁止删除
- **原因分析**
  1. 在客户端执行以下查询命令。
     ```
     kafka-topics.sh --list --zookeeper x.x.x.x:port/kafka
     ```
     查询结果如下：
     ```
     test - marked for deletion
     ```
     通过Manager查看Kafka Broker实例的运行状态。
     执行以下命令进入RunningAsController节点日志目录：
     ```
     cd /var/log/Bigdata/kafka/broker
     ```
     查看controller.log发现ineligible for deletion: test。
     ```
     2016-03-09 11:11:26,228 | INFO  | [main] | [Controller 1]: List of topics to be deleted:  | kafka.controller.KafkaController (Logging.scala:68)
     2016-03-09 11:11:26,229 | INFO  | [main] | [Controller 1]: List of topics ineligible for deletion: test | kafka.controller.KafkaController (Logging.scala:68)
     ```
     
  
  2. 登录MRS集群Manager页面，选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"，搜索并查看"delete.topic.enable"参数，发现参数配置值为"false"，表示服务端配置了禁止删除。
   
- **处理步骤**
  1. 登录MRS集群Manager页面，选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"，搜索"delete.topic.enable"参数。 修改参数取值为"true"保存配置后，重启Kafka服务。
     
  
  2. 通过客户端执行以下查询命令，无Topic:test。
     ```
     kafka-topics.sh --list --zookeeper x.x.x.x:port/kafka
     ```
     进入RunningAsController节点日志目录，在controller.log发现Deletion of topic test successfully，表示已删除成功。
     ```
     2016-03-10 10:39:40,665 | INFO  | [delete-topics-thread-3] | [Partition state machine on Controller 3]: Invoking state change to OfflinePartition for partitions [test,2],[test,15],[test,6],[test,16],[test,12],[test,7],[test,10],[test,13],[test,9],[test,19],[test,3],[test,5],[test,1],[test,0],[test,17],[test,8],[test,4],[test,11],[test,14],[test,18] | kafka.controller.PartitionStateMachine (Logging.scala:68)
     2016-03-10 10:39:40,668 | INFO  | [delete-topics-thread-3] | [Partition state machine on Controller 3]: Invoking state change to NonExistentPartition for partitions [test,2],[test,15],[test,6],[test,16],[test,12],[test,7],[test,10],[test,13],[test,9],[test,19],[test,3],[test,5],[test,1],[test,0],[test,17],[test,8],[test,4],[test,11],[test,14],[test,18] | kafka.controller.PartitionStateMachine (Logging.scala:68)
     2016-03-10 10:39:40,977 | INFO  | [delete-topics-thread-3] | [delete-topics-thread-3], Deletion of topic test successfully completed | kafka.controller.TopicDeletionManager$DeleteTopicsThread (Logging.scala:68)
     ```
     
   
 
#### Kafka配置自动创建，且Producer未停止
- **原因分析**
  1. 执行以下命令进入RunningAsController节点日志目录：
     ```
     cd /var/log/Bigdata/kafka/broker
     ```
     在controller.log发现Deletion successfully，然后又出现New topics: \[Set(test)\]，表明被再次创建。
     ```
     2016-03-10 11:33:35,208 | INFO  | [delete-topics-thread-3] | [delete-topics-thread-3], Deletion of topic test successfully completed | kafka.controller.TopicDeletionManager$DeleteTopicsThread (Logging.scala:68)
     2016-03-10 11:33:38,501 | INFO  | [ZkClient-EventThread-19-192.168.0.122:2181,160.172.0.52:2181,160.172.0.51:2181/kafka] | [TopicChangeListener on Controller 3]: New topics: [Set(test)], deleted topics: [Set()], new partition replica assignment
     ```
     
  
  2. 登录MRS集群Manager页面，选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"，搜索并查看"auto.create.topics.enable"参数，发现参数配置值为"true"，表示Kafka配置了自动创建。
  
  3. 经确认，对该Topic操作的应用没有停止。
   
- **处理步骤**
  1. 停止相关应用。
  
  2. 登录MRS集群Manager页面，选择"集群 \> 服务 \> Kafka \> 配置 \> 全部配置"，搜索"auto.create.topics.enable"参数。 修改参数取值为"false"保存配置后，重启Kafka服务。
     
   
 
