2つのパーティションで実行されているKafkaクラスターがあります。パーティションカウントを3に増やす方法を探していましたが、トピック内の既存のメッセージを失いたくありません。 server.properties
ファイルを変更してパーティションの数を3に増やし、Kafkaを再起動して、Kafkaを停止しようとしました。ただし、それによって何も変わらないようです。 Kafka ConsumerOffsetChecker
を使用すると、まだ2つのパーティションしか使用していないことがわかります。使用しているKafkaバージョンは0.8.2.2です。バージョン0.8.1では、kafka-add-partitions.sh
と呼ばれるスクリプトが使用されていましたが、これでうまくいくと思います。ただし、0.8.2にはそのようなスクリプトはありません。これを達成する方法はありますか?私はまったく新しいトピックを作成する実験を行いましたが、そのトピックではserver.properties
ファイルの変更に従って3つのパーティションを使用しているようです。ただし、既存のトピックについては気にしないようです。
代わりに 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
は、kafka-add-partitionスクリプトによって使用される this コードの一部と AddPartitionsCommand を実行します。
ただし、キーを使用する場合は、再パーティション化に注意する必要があります。
パーティションの1つのユースケースは、データを意味的にパーティションすることであり、パーティションを追加しても既存のデータのパーティションは変更されないことに注意してください彼らはそのパーティションに依存しています。つまり、データが
hash(key) % number_of_partitions
でパーティション化されている場合、このパーティション化はパーティションを追加することでシャッフルされる可能性がありますが、Kafkaはデータを自動的に再配布しません。
私の場合、パラメーター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
ウィンドウで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