我有一个运行2个分区的Kafka集群。我一直在寻找一种方法将分区数增加到3.但是,我不想丢失主题中的现有消息。我尝试停止Kafka,修改server.properties
文件以将分区数增加到3并重新启动Kafka。但是,这似乎没有任何改变。使用Kafka ConsumerOffsetChecker
,我仍然看到它只使用了2个分区。我使用的Kafka版本是0.8.2.2。在0.8.1版本中,曾经有一个名为kafka-add-partitions.sh
的脚本,我想这可能会成功。但是,我在0.8.2中没有看到任何这样的脚本。有没有办法实现这个?我确实尝试创建一个全新的主题,对于那个主题,它似乎根据server.properties
文件中的更改使用了3个分区。但是,对于现有主题,它似乎并不关心。
答案 0 :(得分:74)
您似乎可以使用this脚本:
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name
--partitions 40
在代码中看起来他们做同样的事情:
AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(topic, partitionReplicaList, zkClient, true)
kafka-topics.sh
执行this段代码以及kafka-add-partition脚本使用的AddPartitionsCommand。
但是,使用密钥时必须注意重新分区:
请注意,分区的一个用例是语义分区 数据和添加分区不会改变现有数据的分区,因此如果他们依赖于此,可能会打扰消费者 划分。也就是说,如果数据被
hash(key) % number_of_partitions
分区,那么这个分区可能就是这样 通过添加分区来改组,但卡夫卡不会尝试 以任何方式自动重新分配数据。
答案 1 :(得分:5)
在我的情况下,参数zk_host:port/chroot
的值--zookeeper
引发了以下异常:
错误java.lang.IllegalArgumentException:主题my_topic_name在ZK路径zk_host:port / chroot上不存在。
所以,我尝试了以下内容并且有效:
bin/kafka-topics.sh --alter --zookeeper zk_host:port --topic my_topic_name --partitions 10
答案 2 :(得分:3)
如果您在窗口中使用Kafka 尝试使用此代码更改或添加主题中的分区
.\bin\windows\kafka-topics.bat --alter --zookeeper localhost:2181 --topic TopicName --partitions 20
或
.\bin\windows\kafka-topics.bat --alter --zookeeper localhost:2181 --topic TopicName --replica-assignment 0:1:2,0:1:2,0:1:2,2:1:0 --partitions 10
答案 3 :(得分:3)
对于希望为较新版本的Kafka解决方案的人。请按照此方法进行操作。
Kafka的整个数据保留和传输策略取决于分区,因此请注意增加分区的影响。 (Kafka的较新版本对此显示警告)。尝试避免在一个代理具有过多领导者分区的配置。
有简单的三阶段方法。
步骤1:增加主题的分区
./bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic testKafka_5 --partitions 6
步骤2:为给定主题创建分区json文件
{ “ version”:1,“ partitions”:[ {“ topic”:“ testKafka_5”,“ partition”:0,“ replicas”:[0,1,2]}, {“ topic”:“ testKafka_5”,“ partition”:1,“ replicas”:[2,1,0]},{“ topic”:“ testKafka_5”,“ partition”:2,“ replicas”:[1, 2,0]}, {“ topic”:“ testKafka_5”,“ partition”:3,“ replicas”:[0,1,2]}, {“ topic”:“ testKafka_5”,“ partition”:4,“副本”:[2,1,0]},{“ topic”:“ testKafka_5”,“ partition”:5,“ replicas”:[1, 2,0]} ]}
使用更新的分区和副本创建文件。最好将副本扩展到不同的代理,但副本应存在于同一群集中。考虑到远程副本的延迟。 将给定的文件传输到您的Kafka。
第3步:重新分配分区并进行验证
./bin/kafka-reassign-partitions.sh --zookeeper localhost:9092 --reassignment-json-file bin/increase-replication-factor.json --execute
./bin/kafka-reassign-partitions.sh --zookeeper localhost:9092 --reassignment-json-file bin/increase-replication-factor.json --verify
您可以使用-describe 命令检查更改的效果。
答案 4 :(得分:0)
我认为这个问题有点老了,但我仍然会回答。
如果您有一个Kafka主题但想要更改分区或副本的数量,则可以使用流转换将所有消息从原始主题自动流式传输到一个新的Kafka主题,该主题具有所需的分区或副本的数量