Ich bin neu in kafka. Meine Anforderung ist, ich habe zwei Partitionen zum Beispiel Partition-0 und Partition-1 und ich habe eine Liste von Werten, die auch KEY-Wert enthält. Ich möchte Daten nach meinem Schlüssel wie Schlüssel speichern-1 wird zu Partition-0 gehen, Schlüssel-2 wird zu Partition-1 gehen. Mit der alten API gibt es eine Möglichkeit zu erreichen, dass wir die Partitionsschnittstelle implementieren müssen, aber wie ich das mit der neuen API machen kann. DankeKafka: Wie erreichen Round Robin Partition in Kafka
Antwort
Mit dem neuen Hersteller können Sie auch Partitioner
Schnittstelle implementieren (https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/Partitioner.java), um Round-Robin-Verteilung zu erreichen.
Sie können DefaultPartitioner
als Referenz verwenden - https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java
Sie können durch Überschreiben des default partitioner des kafkas Produzenten zu kafka in Round-Robin-produzieren.
Eine Pseudo Implementierung
class RRPartitioner():
def __init__():
# Using topic metadata get total number of partitions
self.total_partitions = client[topic].get_number_partitions()
self.part_offset = 0
def partitioner(self, key, msg):
if self.part_offset > self.total_partitions:
self.part_offset = 0
return self.part_offset
else:
self.part_offset += 1
return self.part_offset
Vor Implementierung ist es reine Round-Robin, wenn Sie die Nachrichten wollen nach Schlüssel und haben Sie Round-Robin bestellt werden mehr in der benutzerdefinierten Partitionierer zu tun haben.
Wenn Sie Round-Robin-Verhalten wollen, übergeben Sie einfach nicht die Taste beim Schreiben an Producer und DefaultPartitioner
wird die Arbeit für Sie erledigen. Sie müssen keine benutzerdefinierte Implementierung schreiben. Aus dem javadocs:
/**
* The default partitioning strategy:
* <ul>
* <li>If a partition is specified in the record, use it
* <li>If no partition is specified but a key is present choose a partition based on a hash of the key
* <li>If no partition or key is present choose a partition in a round-robin fashion
*/
Dies ist die einfachste Lösung, aber es funktioniert nicht, wenn Sie eine Partition zur Laufzeit hinzufügen, die ein vollständig gültig Fall ist – serejja
True..you muß Hersteller oder Umfrage in regelmäßigen Abständen für Metadaten neu starten Änderungen. Bust die meisten bestehenden Keyed Producer haben das gleiche Problem IIRC. –