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

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

看起来您可以使用此脚本:

 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执行这段代码以及kafka-add-partition脚本使用的AddPartitionsCommand 。

但是,在使用密钥时,您必须注意重新分区:

请注意,分区的一个用例是对数据进行语义分区, 添加分区不会更改现有数据的分区,因此如果依赖于该分区,这可能会干扰消费者。 也就是说,如果数据是通过hash(key) % number_of_partitions进行分区,那么这个分区可能会通过添加分区进行混洗,但Kafka不会尝试以任何方式自动重新分配数据。

在我的例子中,参数--zookeeper的值zk_host:port/chroot引发了以下exception:

错误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