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

2022-08-31 09:42:35

我有一个运行2个分区的Kafka集群。我正在寻找一种将分区计数增加到3的方法。但是,我不想丢失有关该主题的现有消息。我尝试停止Kafka,修改文件以将分区数增加到3并重新启动Kafka。但是,这似乎并没有改变任何事情。使用Kafka,我仍然看到它只使用2个分区。我使用的Kafka版本是0.8.2.2。在0.8.1版本中,曾经有一个名为的脚本,我想它可能会起作用。但是,我在0.8.2中没有看到任何这样的脚本。server.propertiesConsumerOffsetCheckerkafka-add-partitions.sh

  • 有没有办法做到这一点?

我确实尝试创建一个全新的主题,对于这个主题,它似乎确实根据文件中的更改使用了3个分区。但是,对于现有主题,它似乎并不在乎。server.properties


答案 1

看起来你可以改用这个脚本:

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

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

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


答案 2

适合任何想要为较新的Kafka版本提供解决方案的人。请按照此方法操作。

Kafka的整个数据保留和传输策略取决于分区,因此请注意增加分区的影响。(Kafka的新版本显示有关此的警告)尽量避免配置一个代理具有太多前导分区。

有简单的3阶段方法可以做到这一点。

步骤 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,“replicas”:[2,1,0]}, {“topic”:“testKafka_5”,“partition”:5,“replicas”:[1,2,0]} ]}

使用较新的分区和副本创建文件。最好将副本扩展到不同的代理,但它们应存在于同一集群中。考虑远程副本的延迟。将给定的文件传输到您的卡夫卡。

步骤 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 命令检查更改的效果。


推荐