topic中的元数据存储在ZooKeeper中的/brokers/topics和/config/topics路径下,topic中的消息数据存储在log.dir或log.dirs配置的路径下,所以删除topic就需要删除这些路径下的内容。
创建topic:
bin/kafka-topics.sh --create --zookeeper bigdata-pro01.wn.com:2181 --replication-factor 1 --partitions 2 --topic topic-delete-test
生产数据:
bin/kafka-console-producer.sh --broker-list bigdata-pro01.wn.com:9092 --topic topic-delete-test
消费数据(每个分区):
bin/kafka-console-consumer.sh --bootstrap-server bigdata-pro01.wn.com:9092 --topic topic-delete-test --partition 0 --offset 0
bin/kafka-console-consumer.sh --bootstrap-server bigdata-pro01.wn.com:9092 --topic topic-delete-test --partition 1 --offset 0
查看topic列表:
bin/kafka-topics.sh --zookeeper bigdata-pro01.wn.com:2181 --list
日志地址:
查看server.properties中log.dirs=/opt/modules_spark/kafka_2.11-2.1.1/kafka-logs,可以知道kafka topic的消息数据存储地方
方法一:
bin/kafka-topics.sh --zookeeper bigdata-pro01.wn.com:2181 --delete --topic topic-delete-test
前提:执行完删除命令之后会有相关的提示信息,这个提示信息和broker 端配置参数delete.topic.enable 有关。必须将delete.topic.enable参数配置为true 才能够删除主题,这个参数的默认值就是true ,如果配置为false ,那么删除主题的操作将会被忽略。在实际生产环境中,建议将这个参数的值设置为true.
分析:使用kafka-topics.sh 脚本删除主题的行为本质上只是在ZooKeeper中的/admin/delete_topics 路径下创建一个与待删除主题同名的节点,以此标记该主题为待删除的状态。与创建主题相同的是,真正删除主题的动作也是由Kafka 的控制器负责完成的。
衍生:在ZooKeeper中的/admin/delete_topics路径下执行:create /admin/delete_topics/topic-delete-test ""
可以达到相同的效果
检验:在Zookeeper中,执行ls /brokers/topics 和ls /config/topics,可查看删除前后topic的变化;在log.dirs路径下,查看删除前后存储的文件变化。
方法二:
知道删除topic需要具体删除的位置,可以直接手动删除,步骤如下:
第一步:删除ZooKeeper中的节点/config/topics/topic-delete-test
>rmr /config/topics/topic-delete-test
第二步:删除ZooKeeper中的节点/brokers/topics/topic-delete-test及其子节点
>rmr /brokers/topics/topic-delete-test
第三步:删除集群中所有与主题topic-delete-test有关的文件,即log.dirs路径下对应文件
>rm -R topic-delete-test-*
方法三:
通过程序删除topic:
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.AdminClientConfig;
import java.util.Arrays;
import java.util.Properties;
public class KafkaAdminClientTest {
public static void main(String[] args){
String brokerList = "bigdata-pro01.wn.com:9092";
String topic = "topic-delete-test";
Properties props = new Properties();
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,brokerList);
props.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG,30000);
AdminClient client = AdminClient.create(props);
client.deleteTopics(Arrays.asList(topic));
client.close();
}
}