一、创建主题

创建一个kafka-action的主题,该主题拥有2个副本、3个分区,命令如下所示:

./kafka-topics.sh --create --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --replication-factor 2 --partitions 3 --topic kafka-action

在控制台执行结果输出如下:

Created topic "kafka-action".

此时会在${log.dir}目录下创建相应的分区文件目录,副本分别分布在不同的节点上。

kafka 初始化主题 java kafka 创建主题_kafka


同时登录ZooKeeper客户端查看所创建的主题元数据信息,"kafka-action"元数据信息如下:

[zk: localhost:2181(CONNECTED) 3] ls /brokers/topics/kafka-action/partitions
[0, 1, 2]
[zk: localhost:2181(CONNECTED) 6] get /brokers/topics/kafka-action
{"version":1,"partitions":{"2":[0,1],"1":[2,0],"0":[1,2]}}

副本数和分区数的乘积/代理节点数=每个节点存的副本数
副本会分布在不同的节点上,所以副本数不能超过节点数

在创建主题时,我们还可以通过config参数来设置主题级别的配置以覆盖默认配置,可以设置多组配置,具体格式为:

--config config1-name=config1-value --config config2-name=config2-value

创建一个名为config-test的主题,设置该主题的 max.message.bytes为404800字节,执行命令如下:

./kafka-topics.sh --create --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --replication-factor 2 --partitions 3 --topic config-test --config max.message.bytes=404800

输出结果如下:

Created topic "config-test".

在创建主题时若使用了config参数,则通过ZooKeeper客户端可以在/config/topics节点下查看到该主题所覆盖的配置,相关节点信息如下:

[zk: localhost:2181(CONNECTED) 7] get /config/topics/config-test
{"version":1,"config":{"max.message.bytes":"404800"}}

二、删除主题

删除Kafka主题,一般有以下两种方式。
(1)手动删除各节点${log.dir}目录下该主题分区文件夹,同时登录ZooKeeper客户端删除待删除主题对应的节点,主题元数据保存在/brokers/topics和/config/topics目录下。
(2)执行kafka-topic.shj脚本进行删除,若希望通过该脚本彻底删除主题,则需要保证在启动Kafka时所加载的server.properties文件中配置delete.topic.enable=true,该配置版本默认为false,新版默认为true。否则执行该脚本并未真正删除主题,而是在ZooKeeper的/admin/delete_topics目录下创建一个与待删除主题同名的节点,将该主题标记为删除状态。

删除主题"kafka-action"的操作命令如下:

./kafka-topics.sh --delete --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topic kafka-action
Topic kafka-action is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.

三、查看主题

Kafka提供了list和describe两个命令方便查看主题信息,其中list参数列出Kafka所有的主题名,describe参数可以查看所有主题或某个特定主题的信息。
1、查看所有主题
执行以下命令:

kafka-topics.sh --list --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181
__consumer_offsets
config-test

2、查看某个特定主题信息
当执行describe命令时,若指定topic参数则查看特定主题当信息,若不指定topic参数则查看所有主题信息。执行以下命令查看 config-test主题的信息:

kafka-topics.sh --describe --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topic config-test

Topic:config-test	PartitionCount:3	ReplicationFactor:2	Configs:max.message.bytes=404800
	Topic: config-test	Partition: 0	Leader: 1	Replicas: 1,2	Isr: 2,1
	Topic: config-test	Partition: 1	Leader: 2	Replicas: 2,0	Isr: 2,0
	Topic: config-test	Partition: 2	Leader: 0	Replicas: 0,1	Isr: 1,0

从输出结果可以看到:主题信息的第一行分别展示了主题名、该主题的分区总数、该主题的副本总数、创建主题时通过config参数设置的配置信息,从第二行开始按主题的分区编号,展示每个分区的Leader副本节点、副本列表AR和ISR列表信息,ISR由Leader副本管理。

3、查看正在同步的主题
通过describe与under-replicated-partitions命令组合使用,可以查看处于"under replicated"状态的分区。处于该状态的主题可能正在进行同步操作,也有可能同步发生异常,即此时所查询到的主题分区ISR列表长度小于AR列表长度。

kafka-topics.sh --describe --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --under-replicated-partitions

4、查看没有Leader的分区
通过describe与unavailable-partitions命令组合使用,可以查看没有Leader副本的主题。

kafka-topics.sh --describe --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --unavailable-partitions

5、查看主题覆盖的配置
通过describe与topics-with-overrides命令组合使用,可以查看主题覆盖了哪些配置。组合使用与只有describe命令的区别在于:topics-with-overrides命令只显示describe命令执行的第一行信息。

kafka-topics.sh --describe --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topics-with-overrides
Topic:__consumer_offsets	PartitionCount:50	ReplicationFactor:1	Configs:segment.bytes=104857600,cleanup.policy=compact,compression.type=producer
Topic:config-test	PartitionCount:3	ReplicationFactor:2	Configs:max.message.bytes=404800

四、修改主题

当创建一个主题之后,可以通过alter命令对主题进行修改,包括修改主题级别的配置、增加主题分区、修改主题副本分配方案、修改主题Offset等。下面详细讲解如何通过Kafka的shell脚本对主题进行修改。
1、修改主题级别的配置

kafka-topics.sh --alter --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topic config-test --config max.message.bytes=204800
kafka-topics.sh --alter --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topic config-test --config segment.bytes=209715200

查看主题已覆盖的信息:

kafka-topics.sh --describe --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topics-with-overrides --topic config-test
Topic:config-test	PartitionCount:3	ReplicationFactor:2	Configs:segment.bytes=209715200,max.message.bytes=204800

2、增加分区
Kafka并不支持减少分区的操作,我们只能为一个主题增加分区。例如,主题"config-test"目前有3个分区,如果将其增加到5个分区,操作如下:

kafka-topics.sh --alter --zookeeper 172.20.10.3:2181,172.20.10.4:2181,172.20.10.5:2181 --topic config-test --partitions 5
Topic:config-test	PartitionCount:5	ReplicationFactor:2	Configs:segment.bytes=209715200,max.message.bytes=204800
	Topic: config-test	Partition: 0	Leader: 1	Replicas: 1,2	Isr: 2,1
	Topic: config-test	Partition: 1	Leader: 2	Replicas: 2,0	Isr: 2,0
	Topic: config-test	Partition: 2	Leader: 0	Replicas: 0,1	Isr: 1,0
	Topic: config-test	Partition: 3	Leader: 1	Replicas: 1,2	Isr: 1,2
	Topic: config-test	Partition: 4	Leader: 2	Replicas: 2,0	Isr: 2,0