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

Asi*_*bal 48 java distributed-computing apache-kafka

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

小智 81

看起来您可以使用脚本:

bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name 
   --partitions 40 
Run Code Online (Sandbox Code Playgroud)

在代码中看起来他们做同样的事情:

 AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(topic, partitionReplicaList, zkClient, true)
Run Code Online (Sandbox Code Playgroud)

kafka-topics.sh执行这段代码以及kafka-add-partition脚本使用的AddPartitionsCommand.

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

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

  • 如果数据必须重新分区,有没有办法只移动尚未阅读的消息而忽略已阅读的消息? (3认同)
  • 与"仅限追加"的理念一致,我想你必须付出很大的努力才能实现这一目标.我想说最简单的是停止对该主题的消费,创建一个包含所需分区数量的新主题,将未读消息重新发布到新主题上,然后继续消费新主题. (2认同)

c0d*_*512 15

对于任何想要更新 Kafka 版本的解决方案的人。请遵循此方法。

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

对此有简单的 3 阶段方法。

第一步:增加topics中的partition

./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]} ]}

使用较新的分区和副本创建文件。最好将副本扩展到不同的代理,但它们应该存在于同一个集群中。考虑远程副本的延迟。将给定的文件传输到您的 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
Run Code Online (Sandbox Code Playgroud)

您可以使用--describe命令检查更改的效果。


BER*_*ine 12

我觉得这个问题有点老了,但我还是会回答。

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


小智 9

如果您在 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

  • 选项 `--zookeeper` 已弃用,请使用 `--bootstrap-server` 代替。 (3认同)

Ali*_*hir 8

kafka_2.13-3.2.0
Run Code Online (Sandbox Code Playgroud)

这对我有用:

/bin/kafka-topics.sh --bootstrap-server localhost:9092 --alter --topic apache_event_log_topic --partitions 4
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)