是否可以在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