Kafka 中常用的 Topic 管理操作

1,700 阅读2分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

相关:Apache Kafka 的本地部署一文搞定 Kafka 常见术语

如果你还不知道如何在本地部署一个 Kafka 实例作为实验环境,请参考上面的文章。

操作前记得启动 ZooKeeper 和 Kafka 服务:

bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties

本文主要总结 Kafka 中用来管理 Topic 的常见操作。以下操作均在 Kafka 的目录下执行,它的脚本都在 bin/ 目录中(针对 Windows 操作系统的 .bat 文件在 bin/windows/ 中)。

针对 Topic 进行操作的指令,大多是通过 bin/kafka-topics.sh 来进行,执行这个脚本时,需要通过 --bootstrap-server 指定要连接到的 Kafka Broker,其后是具体的操作。

创建主题

创建主题的操作如下:

bin/kafka-topics.sh --bootstrap-server <host>:<port> --create --topic <topic_name>  --partitions 1 --replication-factor 1

其中:

  • --bootstrap-server <host>:<port> 指定要连接的 Kafka Broker,这里需要提供 Kafka Broker 的服务地址和端口号。
  • --create 代表要执行「创建」操作。
  • --topic <topic_name> 指定即将创建的主题的名称
  • --partitions 1 指定主题的分区数。
  • --replication-factor 1 指定副本数。

查询主题

查询已经创建好的主题列表:

bin/kafka-topics.sh --bootstrap-server <host>:<port> --list

把创建操作的 --create 及之后的内容,替换成 --list 即可。

如果想要查看某个主题的详细信息,则可以执行:

bin/kafka-topics.sh --bootstrap-server <host>:<port> --describe --topic <topic_name>

执行结果类似一下内容:

Topic: fooTopic	TopicId: EXpCrwSuTDCiuBtLh2V9gg	PartitionCount: 1	ReplicationFactor: 1	Configs: segment.bytes=1073741824
	Topic: fooTopic	Partition: 0	Leader: 0	Replicas: 0	Isr: 0

包含了主题的详细信息以及各个分区的信息,这个命令需要指定查询的主题名称,如果不提供的话,则会展示所有可见的主题的详细信息。

增加主题的分区数

修改主题分区数的操作如下:

bin/kafka-topics.sh --bootstrap-server <host>:<port> --alter --topic <topic_name> --partitions <新分区数>

执行命令后,如果控制台什么都没有出现,则证明执行成功了,可以使用 --describe 来查看一下结果:

Topic: fooTopic	TopicId: EXpCrwSuTDCiuBtLh2V9gg	PartitionCount: 2	ReplicationFactor: 1	Configs: segment.bytes=1073741824
	Topic: fooTopic	Partition: 0	Leader: 0	Replicas: 0	Isr: 0
	Topic: fooTopic	Partition: 1	Leader: 0	Replicas: 0	Isr: 0

之所以把这个操作叫做「增加主题的分区数」而不是「修改主题的分区数」,是因为这里指定的分区数,一定要比现有的分区数大,否则会报错。报错信息类似一下内容:

ERROR org.apache.kafka.common.errors.InvalidPartitionsException: Topic currently has 2 partitions, which is higher than the requested 1.
 (kafka.admin.TopicCommand$)

删除主题

删除主题使用 --delete 操作,需要指定要删除的主题名称;

bin/kafka-topics.sh --bootstrap-server <host>:<port> --delete --topic <topic_name>

这里值得注意的是,如果有副本所在的 Broker 处于宕机的状态,是无法完成删除的。

修改 Topic 级别的参数

bin/kafka-configs.sh --zookeeper <host>:<port> --entity-type topics --entity-name <topic_name> --alter --add-config <参数名>=<参数值>

注意这里并没有通过 --bootstrap-server 指定 Broker 节点的连接,而至通过 --zookeeper 指定了 ZooKeeper 的连接。