2015-11-12 10 views
17

Ich habe einen Kafka-Cluster mit 2 Partitionen. Ich suchte nach einer Möglichkeit, die Anzahl der Partitionen auf 3 zu erhöhen. Ich möchte jedoch keine vorhandenen Nachrichten im Thema verlieren. Ich habe versucht, Kafka zu stoppen, die Datei server.properties zu modifizieren, um die Anzahl der Partitionen auf 3 zu erhöhen und Kafka neu zu starten. Das scheint jedoch nichts zu ändern. Mit Kafka ConsumerOffsetChecker sehe ich immer noch, dass es nur 2 Partitionen verwendet. Die Kafka-Version, die ich verwende, ist 0.8.2.2. In der Version 0.8.1 gab es ein Skript mit dem Namen kafka-add-partitions.sh, von dem ich denke, dass es den Trick leisten könnte. In 0.8.2 sehe ich jedoch kein solches Skript. Gibt es einen Weg, dies zu erreichen? Ich habe mit dem Erstellen eines ganz neuen Themas experimentiert und dafür scheint es 3 Partitionen zu verwenden, wie in der Datei server.properties. Für bestehende Themen scheint das jedoch nicht wichtig zu sein.Ist es möglich, Partitionen zu einem bestehenden Thema in Kafka hinzuzufügen 0.8.2

+0

Die neueste Version von Apache kafka ist 0.8.2.2, bezweifle ich, Sie verwenden „2.10“. Möglicherweise möchten Sie die Versionen erneut überprüfen. – C4stor

+0

@C4stor Eigentlich meinte ich Kafka, das auf Scala 2.10 basiert, was genau der Version 0.8.2.2 entspricht. Entschuldigung für die Verwirrung. Ich werde meine Frage bearbeiten. –

Antwort

36

Sieht aus wie Sie this Skript stattdessen verwenden können:

bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name 
    --partitions 40 

Im Code sieht es aus wie sie gleiche tun:

AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(topic, partitionReplicaList, zkClient, true) 

kafka-topics.sh führt this Stück Code sowie AddPartitionsCommand verwendet von kafka-add-partition-Skript.

aber man muss sich bewusst sein Neuaufteilung, wenn Schlüssel:

Beachten Sie, dass ein Anwendungsfall für Partitionen Partition Daten semantisch ist, und Hinzufügen von Partitionen ändert nicht die Partitionierung bestehende Daten so kann dies die Verbraucher stören, wenn sie auf die Partition angewiesen sind. Das heißt, wenn Daten durch hash(key) % number_of_partitions partitioniert werden, dann wird diese Partitionierung möglicherweise durch Mischen von Partitionen gemischt, aber Kafka wird nicht versuchen, Daten in irgendeiner Weise automatisch zu umzuverteilen.

+0

Danke. Werde es versuchen. –

+1

Wenn die Daten neu partitioniert werden müssen, gibt es eine Möglichkeit, nur Nachrichten zu verschieben, die nicht gelesen wurden, und Nachrichten zu ignorieren, die gelesen wurden? – Glide

+1

im Einklang mit der "Append-only" -Philosophie, würde ich mir vorstellen, dass Sie große Anstrengungen unternehmen müssen, um dies zu erreichen. Ich würde sagen, das einfachste ist, den Verbrauch für dieses Thema zu stoppen, ein neues Thema mit der gewünschten Anzahl von Partitionen zu erstellen, die ungelesenen Nachrichten erneut auf dem neuen Thema zu veröffentlichen und dann den Verbrauch des neuen Themas fortzusetzen. – CmdrDats

2

Bitte beachten Sie, dass in meinem Fall Wert zk_host: port/chroot für Parameter --zookeeper die folgende Ausnahme ausgelöst hat:

ERROR java.lang.IllegalArgumentException: Thema my_topic_name existiert nicht auf ZK Pfad zk_host: port/Chroot.

Also habe ich versucht, die folgende und es funktionierte:

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

'chroot' ist eine * optionale * Konfigurationseinstellung, die nicht wörtlich genommen werden soll –