Kafka Topic无法删除问题的定位过程(0.8.2.1) 2016-04-24 15:30

说明

Kafka从0.8.2.X版本开始提供了删除Topic的功能。

具体是用法是在各个broker中配置delete.topic.enable=true,然后再执行delete动作。

问题描述

测试发现,Kafka 0.8.2.1版本中虽然已经配置了delete.topic.enable=true, 但仍然无法删除Topic。

执行删除动作后,用list查询出来,也仅仅标识该Topic为'marked for deletion',但未被删除。

[root@data01 logs]# /opt/kafka/bin/kafka-topics.sh --zookeeper data01:2181,data02:2181,data03:2181/kafka --delete --topic cheyo
Topic cheyo is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
[root@data01 logs]# /opt/kafka/bin/kafka-topics.sh --zookeeper data01:2181,data02:2181,data03:2181/kafka --list
NginxLogTopic
cheyo - marked for deletion
[root@data01 logs]#

定位过程

通过server.log查询broker1有如有下错误:

[2016-04-24 17:55:09,703] FATAL  (kafka.Kafka$)
java.lang.NumberFormatException: For input string: "1 "
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:492)
    at java.lang.Integer.parseInt(Integer.java:527)
    at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:247)
    at scala.collection.immutable.StringOps.toInt(StringOps.scala:30)
    at kafka.utils.VerifiableProperties.getIntInRange(VerifiableProperties.scala:75)
    at kafka.utils.VerifiableProperties.getIntInRange(VerifiableProperties.scala:48)
    at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:75)
    at kafka.server.KafkaConfig.<init>(KafkaConfig.scala:31)
    at kafka.Kafka$.main(Kafka.scala:35)
    at kafka.Kafka.main(Kafka.scala)

原来是因为broker1的server.properties中broker.id参数的值"1"后面多了一个空格。

1
2
3
# The id of the broker. This must be set to a unique integer for each broker.
#此处1后面多了一个空格
broker.id=1

此时查看Zookeeper中的Kafka注册信息,可以看到此broker 1未注册成功, 仅broker 2和3注册成功:

[zk: localhost:2181(CONNECTED) 4] ls /kafka/brokers/ids
[3, 2]
[zk: localhost:2181(CONNECTED) 5

也就是说此时,并未所有的broker都正常启动,导致Topic无法正常删除。

将broker1中多余的空格删除后,重启broker,topic可正常删除,问题解决。

参考文档

关于Kafka的Topic删除机制,可参考文档:

  1. Kafka0.8.2.1删除topic逻辑
Tags: #Kafka    Post on Kafka