1. 创建topic
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --create --topic topic-create --partitions 4 --replication-factor 2
返回结果:Created topic "topic-create".
参数解析
--zookeeper 指定kafka所连接的zookeeper服务地址
--topic 指定所要创建主题的名称
--replicator-factor 指定了副本因子(即副本数量)
--partitions 指定分区个数
--create 是创建主题的的动作指令
2. 展示主题的更多具体信息
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic topic-create
输出结果:
Topic:topic-create PartitionCount:4 ReplicationFactor:2 Configs:
Topic: topic-create Partition: 0 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 1 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
Topic: topic-create Partition: 2 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 3 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
结果解释:
Topic:topic名字, PartitionCount:分区个数,ReplicationFactor:副本因子,Configs: 表示创建或修改主题时指定的参数配置;
Topic和Partition分表表示主题名称和分区号。Leader表示分区的Leader副本所对应的brokerID,Isr表示分区的ISR集合,Replicas表示分区的所有的副本分配情况,即AR集合,其中的数字都表示的是brokerID。
备注: kafka-topics.sh命令还有一些其他的参数,比如:
create topic时,--replica-assigment参数,来手动指定分区副本的分配方案。if-not-exists参数,在发生命名冲突时候,就不做任何处理(即不创建主题,也不报错),如果没发生命名冲突,就正常创建,如果不带这个参数,如果有命名冲突就会报TopicExistsException的异常信息。
describe topic时,
--under-repicated-partitions参数可以找出所有包含失效副本的分区。
--unavailable-partitions 可以查看主题中没有leader副本的分区,这些分区已经处于离线状态,对于外界的生产者和消费者来说处于不可用状态。
--topics-with-overrides 可以找出所有包含覆盖配置的主题,它只会列出包含了与集群不一样配置的主题,使用此参数只显示原本只有describe指令的第一行信息。
3. 查看主题
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --list
4. 修改主题
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-create --partitions 5
修改topic名为 topic-create 的分区数,由4变成5
修改前
Topic:topic-create PartitionCount:4 ReplicationFactor:2 Configs:
Topic: topic-create Partition: 0 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 1 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
Topic: topic-create Partition: 2 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 3 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
修改后
Topic:topic-create PartitionCount:5 ReplicationFactor:2 Configs:
Topic: topic-create Partition: 0 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 1 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
Topic: topic-create Partition: 2 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
Topic: topic-create Partition: 3 Leader: 1063 Replicas: 1063,1064 Isr: 1063,1064
Topic: topic-create Partition: 4 Leader: 1064 Replicas: 1064,1063 Isr: 1064,1063
备注:目前kafka只支持增加分区数而不支持减少分区数,如果减少的话。会报出InvalidPartitionsException的异常。
修改主题时,可以配置if-extists参数来忽略异常。如果不指定该参数,修改一个不存在的分区,会报出错误信息“Topic topic-name does not exsit”
在创建完主题之后,我们还可以通过alter指令配合config参数增加或修改一些配置以覆盖他们配置原有的值。比如将主题topic-config的max.message.bytes配置值从10000修改为2000。
# 修改前查看
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic topic-config
# 修改
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --config max.message.bytes=2000
# 修改后查看
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --describe --topic topic-config
删除之前的配置
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --alter --topic topic-config --delete-config segment.bytes
在变更(增删改)配置的操作执行之后都会提示一段告警信息,指明了使用kafka-topic.sh脚本的alter指令会变更主题配置的功能已经过时(deprecated),将在未来的版本中删除,并且使用kafka-config.sh脚本来实现相关功能。
5. 删除主题
bin/kafka-topics.sh --zookeeper localhost:2181/kafka --delete --topic topic-create
Topic topic-create is marked for deletion.
Note: This will have no impact if delete.topic.enable is not set to true.
备注: 如果要删除的主题是kafka内部主题,那么删除是就会报错。如__consumer_offsets 和__transaction_state
尝试删除一个不存在的主题也会报错。可以加上if-exists来规避。
使用kafka-topics.sh脚本删除主题的行为本质上只是在zookeeper中的/admin/delete_topics路径下创建一个与待删除主题同名的节点,以此标记该主题为待删除的状态。与创建主题相同的是,真正删除主题的动作也是有kafka的控制器负责完成的。
删除主题是不可逆的操作。一旦删除之后,与其相关的所有消息数据会被全部删除。所以在执行这一操作的时候也要三思而后行。
参数名称 | 释义 |
alter | 用于修改主题,包括分区数及主题的配置 |
config <键值对> | 创建或修改主题时,用于设置主题级别的参数 |
create | 创建主题 |
delete | 删除主题 |
delete-config <配置名称> | 删除主题级别被覆盖的配置 |
describe | 查看主题的详细信息 |
disable-rack-aware | 创建主题时不考虑机架信息 |
help | 打印帮助信息 |
if-exists | 修改或删除主题时使用,只有当主题存在时才会执行操作 |
if-not-exists | 创建主题时使用,只有主题不存在时才会执行动作 |
list | 列出所有可用的主题 |
partitions <分区数> | 创建主题或增加分区时指定分区数 |
replica-assignment <分配方案> | 手工指定分区副本分配方案 |
replication-factor <副本数> | 创建主题时指定副本因子 |
topic <主题名称> | 指定主题名称 |
topics-with-overrides | 使用describe查看主题信息时,只展示包含覆盖配置的主题 |
unavailable-partitions | 使用describe查看主题信息时,只展示包含没有leader副本的分区 |
under-replicated-partitions | 使用describe查看主题信息时,只展示包含失效副本的分区 |
zookeeper | 指定连接的zookeeper地址信息(必填项) |