2016-07-28 66 views
1

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

0

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.

+0

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

+0

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. –

0

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 
*/