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

时间:2015-11-12 17:43:31

标签: java apache-kafka distributed-computing

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

5 个答案:

答案 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主题,该主题具有所需的分区或副本的数量