Kafka删除topic

思路

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();
    }
}

 

你可能感兴趣的:(#,Kafka)