是否可以将分区添加到Kafka 0.8.2中的现有主题


75

我有一个带有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个分区。但是,对于现有主题,似乎并不在乎。


apache kafka的最新版本是0.8.2.2,我怀疑您使用的是“ 2.10”。您可能要再次检查版本。
C4stor

@ C4stor实际上,我指的是基于Scala 2.10的Kafka,该版本正是您提到的0.8.2.2。对困惑感到抱歉。我将编辑我的问题。
Asif Iqbal

Answers:


118

看来您可以改用以下脚本:

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不会尝试以任何方式自动重新分配数据。


3
如果必须对数据进行分区,是否有办法仅移动未读取的消息,而忽略已读取的消息?
下滑

3
符合“仅追加”的理念,我想您将需要花很长时间才能实现这一目标。我想说的最简单的方法是停止对该主题的使用,使用所需的分区数量创建一个新主题,将未读消息重新发布到新主题上,然后继续使用新主题。
CmdrDats

@CmdrDats,您是否可以让我知道这方面是否有所改进,否则我们仍将使用您上面建议的“重新发布”方法来解决此问题。
Nag

11

对于任何需要较新版本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,“副本”:[0,1,2]},{“ topic”:“ testKafka_5”,“ partition“:1,” replicas“:[2,1,0]},{” topic“:” testKafka_5“,” partition“:2,” replicas“:[1,2,0]},{” topic“ :“ testKafka_5”,“分区”:3,“副本”:[0,1,2]},{“ topic”:“ testKafka_5”,“分区”: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命令检查更改的效果。


6

就我而言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

chroot是一个可选的配置设置,并不意味着从字面上
理解

只需确保所有复制集/代理都已启动。否则,它将引发以下错误:RROR org.apache.kafka.common.errors.InvalidReplicationFactorException:复制因子:比可用代理大2:1.
代码的

6

如果您在Windows中使用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


0

我认为这个问题有点老了,但我仍然会回答。

如果您有一个Kafka主题,但想更改分区或副本的数量,则可以使用流转换将所有消息从原始主题自动流式传输到具有所需分区或副本数量的新Kafka主题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.