2015-11-12 4 views
17

2つのパーティションで動作するKafkaクラスターがあります。私は、パーティション数を3に増やす方法を探していました。しかし、トピックの既存のメッセージを失いたくはありません。私はKafkaを停止し、server.propertiesファイルを変更してパーティション数を3に増やし、Kafkaを再起動しました。しかし、それは何も変わらないようです。 Kafka ConsumerOffsetCheckerを使用しても、まだ2つのパーティションしか使用していないことがわかります。私が使っているカフカのバージョンは0.8.2.2です。バージョン0.8.1には、kafka-add-partitions.shというスクリプトがありましたが、それは私がこのトリックを行うかもしれないと思います。しかし、私は0.8.2でそのようなスクリプトは見ません。これを達成する方法はありますか?私は全く新しいトピックを作成して実験しましたが、server.propertiesファイルの変更ごとに3つのパーティションを使用しているようです。しかし、既存のトピックについては、気にしていないようです。カフカの既存のトピックにパーティションを追加することは可能ですか?0.8.2

+0

をapacheのカフカの最新リリースは0.8.2.2ですが、私はあなたが「2.10」を使用している疑い。バージョンをもう一度チェックしたいかもしれません。 – C4stor

+0

@ C4stor実際、私はScala 2.10に基づいたKafkaを意味していました。これはあなたが0.8.2.2で述べたバージョンとまったく同じです。混乱させて申し訳ありません。私は私の質問を編集します。おかげさまで –

答えて

36

あなたの代わりに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.shthisコードの一部などで使用されるAddPartitionsCommandを実行kafka-add-partitionスクリプト。

キーを使用した場合の再分割を意識する必要がしかし:

パーティションに対して1つのユースケースは、パーティションに データを意味的にすることであることに注意してください、と追加するパーティションはのパーティションを変更しません既存のデータです。そのため、消費者がそのパーティションに頼っている場合は、これが妨げられる可能性があります。つまり、データがhash(key) % number_of_partitionsでパーティション化されている場合、このパーティション分割はパーティションを追加することによって にシャッフルされますが、 は自動的にデータを再分配しようとはしません。パラメータのポート/ chrootの次の例外がスローされました--zookeeper:

ERRORのjava.lang.IllegalArgumentExceptionが:トピックmy_topic_nameはZKパスzk_hostに存在しません:ポートを

+0

試してみる。 –

+1

データを再分割する必要がある場合、読み込まれていないメッセージだけを移動し、読み込まれたメッセージは無視しますか? – Glide

+1

の「追記のみ」という考え方に沿って、私はあなたがこれを達成するためには長けていると思います。最も簡単なのは、そのトピックの消費を停止し、必要なパーティションの量で新しいトピックを作成し、未読メッセージを新しいトピックに再パブリッシュして、新しいトピックから消費を継続することです。 – CmdrDats

2

は親切に私の場合値zk_hostであることに注意してください/ chroot。

だから、私は次のことを試してみました、働いた:

bin/kafka-topics.sh --alter --zookeeper zk_host:port --topic my_topic_name --partitions 10 
+0

'' chroot'は*オプションの構成設定です。文字通りとは解釈されません。 –

関連する問題