是否可以在Kafka 0.8.2中为现有主题添加分区

问题描述 投票:43回答:3

我有一个运行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个分区。但是,对于现有主题,它似乎并不关心。

java apache-kafka distributed-computing
3个回答
76
投票

看起来您可以使用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分区,那么这个分区可能会通过添加分区进行混洗,但Kafka不会尝试以任何方式自动重新分配数据。


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

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

热门问题
推荐问题
最新问题