首页/数据/数据工程与 ETL 速查/kafka-topics.sh 修改分区数
Kafka64 条

kafka-topics.sh 修改分区数

主题创建后只能增加分区,不能减少;增加分区会改变 key 到分区的映射,依赖同 key 有序的链路要确认可接受再操作。

改分区数能改什么

kafka-topics.sh 的 --alter 用来调整已存在主题的分区数。Kafka 只允许增加分区,不允许减少:因为分区是数据的最小组织单位,减少意味着必须搬迁并合并已有数据,官方把这件事交给了重分配工具而不是建主题命令。增加分区本身是元数据操作、速度很快,但会改变「key 经过哈希落到哪个分区」的映射,依赖同 key 有序的链路要提前评估。

基本信息

支持仅能增加分区数,--partitions 必须大于当前值
不支持减少分区、直接降低副本因子
副作用key 到分区的映射变化,消费者可能触发再均衡
命令位置Kafka 发行包 bin/kafka-topics.sh(Windows 为 .bat)
替代工具kafka-reassign-partitions.sh 处理分区迁移与副本调整

增加分区

增加分区
kafka-topics.sh --bootstrap-server localhost:9092 \
  --alter --topic orders --partitions 12

# 改完确认:PartitionCount 应为新值,Partition 列表要逐行检查
kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic orders | head -3

# 主题级参数(如保留时长)也用同一个命令改
kafka-configs.sh --bootstrap-server localhost:9092 --alter \
  --entity-type topics --entity-name orders --add-config retention.ms=604800000

典型使用场景

  • 吞吐不足:分区数少于消费者实例数,加分区让更多消费者真正并行
  • 容量规划:业务量增长后单分区数据量偏大,提前扩容留出余量
  • 消费端扩容:实例数增加后需要同步提高分区数才能提升并行度
  • 迁移准备:为新集群或新磁盘布局调整分区与副本分配
  • 排查热点:确认是不是少数分区承载了大部分流量

操作与后果对照

操作能否直接做后果
增加分区数可以key 映射变化,触发再均衡
减少分区数不可以需重建主题并搬迁数据
提高副本因子不能直接改用重分配工具生成迁移方案
降低副本因子不能直接改同样走重分配,且降低冗余
修改 retention 等主题参数可以通过 kafka-configs 变更,影响数据保留
减少分区或改副本因子要借助重分配工具(reassign),且有数据搬迁成本,操作前务必确认。
分区数只增不减,意味着要预留余量:分区建得太少会被迫扩容(影响 key 有序),建得太多则增加元数据与文件句柄开销,通常按目标吞吐与消费者数量估算后取整。

易错点

  • 对按 key 聚合的下游,分区扩容后同一 key 会落到新分区,务必先评估数据语义
  • 自动扩分区脚本未加锁会出现并发修改,导致目标分区数非预期
  • 以为减少分区只是个命令,实际必须重建主题并搬迁数据
  • 在业务高峰执行分区扩容,再均衡叠加流量高峰会放大消费延迟
  • 只改分区数不看副本分布,新增分区可能集中落在少数 broker 上造成倾斜

数据来源与参考

  • Apache Kafka 官方文档:Modify Topics(增加分区)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌