主题管理

主题

创建主题
手动创建
  • 命令(kafka的bin目录下):kafka-topics.sh -zookeeper localhost:2181 --create --topic topicname --partitions 2 --replication-factor 1

    • localhost:2181 zookeeper所在的ip,zookeeper必传参数,多个zookeeper用逗号隔开

    • paratitions用来设置topic分区数

    • replication-factor主题副本数,每个副本分布在不同节点,不能超过总节点数。

自动创建

生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。不过我们一般不建议将auto.create.topics.enable参数设置为true,因为这个参数会影响topic的管理与维护。

server.properties中配置auto.create.topics.enable=true,还可以num.partitions配置自动分区数,default.replication.factor配置自动副本数

查看topic元数据信息
  1. 连接:命令(zookeeper的bin目录下):./zkCli.sh -server localhost:2181
  2. 查看:get /brokers/topics/topicname
查看主题
  • 查看所有主题(kafka的bin目录下):./kafka-topics.sh --zookeeper localhost:2181 --list
  • 查看指定主题:./kafka-topics.sh --zookeeper 192.168.0.191:2181 --describe --topic topicname
修改主题
增加修改配置
  • 修改主题分区数为4:./kafka-topics.sh --zookpeeper localhost:2181 --alter --topic topicname --partitions 4

    只能增加分区,减少分区会报错,其他参数一样设置,

  • 增加配置:./kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicname --config flush.messages=1

删除配置
  • ./kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicname --delete-config flush.messages
删除主题
  • delete.topic.enable=true,直接删除topic
  • delete.topic.enable=false
    • topic没有使用过,可以彻底删除
    • topic使用过,并没有真正删除,只是标记为删除(marked for deletion),重启Kafka Server后删除
      • ./kafaka-topics.sh --zookeeper localhost:2181 --delete --topic topicname

分区

增加分区
  • ./kafka-topics.sh --zookpeeper localhost:2181 --alter --topic topicname --partitions 4,只能增加,不能减少

Topic其他参数

官方文档

KafkaAdminClient

public class MyAdminClient {
    private static final String brokerList = "192.168.0.191:9092";
    private static final String topic = "jpy";

    public static AdminClient init() {
        Properties properties = new Properties();
        properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
        properties.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 30000);
        return AdminClient.create(properties);
    }

    public static void main(String[] args) {
        addPartition();//修改分区
        describeTopic();//主题信息
        describeTopicConfig();//查看主题配置
        alterConfig();//修改配置
        createTopic();//创建主题
        topicList();//所有主题
        deleteTopic();//删除主题
    }

    //修改分区数量
    public static void addPartition() {
        AdminClient client = init();
        //修改分区数量
        NewPartitions newPartitions = NewPartitions.increaseTo(4);
        Map<String, NewPartitions> newPartitionsMap = new HashMap<>();
        newPartitionsMap.put(topic, newPartitions);
        CreatePartitionsResult result = client.createPartitions(newPartitionsMap);
        try {
            result.all().get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //主题详细信息
    public static void describeTopic() {
        AdminClient client = init();
        DescribeTopicsResult describeTopicsResult = client.describeTopics(Arrays.asList(topic));
        try {
            Map<String, TopicDescription> stringTopicDescriptionMap = describeTopicsResult.all().get();
            System.out.println(stringTopicDescriptionMap);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //查看主题配置
    public static void describeTopicConfig() {
        AdminClient client = init();
        ConfigResource resource = new ConfigResource(ConfigResource.Type.TOPIC, topic);
        DescribeConfigsResult result = client.describeConfigs(Arrays.asList(resource));
        try {
            Config config = result.all().get().get(resource);
            System.out.println(config);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //修改配置
    public static void alterConfig() {
        AdminClient client = init();
        Map<ConfigResource, Collection<AlterConfigOp>> configMap = new HashMap<>();
        ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, topic);
        AlterConfigOp alterConfigOp = new AlterConfigOp(new ConfigEntry("preallocate", "false"), AlterConfigOp.OpType.SET);
        configMap.put(configResource, Arrays.asList(alterConfigOp));
        AlterConfigsResult alterConfigsResult = client.incrementalAlterConfigs(configMap);
        try {
            alterConfigsResult.all().get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //创建主题
    public static void createTopic() {
        AdminClient client = init();
        CreateTopicsResult result = client.createTopics(Arrays.asList(new NewTopic("m", 3, (short) 1)));
        try {
            result.all().get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //查看所有主题
    public static void topicList() {
        AdminClient client = init();
        /*ListTopicsOptions options = new ListTopicsOptions();
        //是否查看Internet选项,不显示内部topic,offsets
        options.listInternal(true);
        ListTopicsResult listTopicsResult = client.listTopics(options);*/
        ListTopicsResult listTopicsResult = client.listTopics();
        try {
            Set<String> set = listTopicsResult.names().get();
            //输出topic的名字
            set.forEach(System.out::println);//所有topic名字

            Collection<TopicListing> topicListings = listTopicsResult.listings().get();
            //输出topic信息,名字和internal
            topicListings.forEach(System.out::println);//(name=jpy,internal=false),.....

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }

    //删除主题
    public static void deleteTopic() {
        AdminClient client = init();
        DeleteTopicsResult deleteTopicsResult = client.deleteTopics(Arrays.asList(topic));
        try {
            //执行删除
            deleteTopicsResult.all().get();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            client.close();
        }
    }
}
posted @   jpy  阅读(7)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示