2016-07-28 2 views
1

Я новичок в kafka. Мое требование: у меня есть два раздела, например Partition-0 и Partition-1, и у меня есть список значений, который также содержит значение KEY. Я хочу хранить данные в соответствии с моим ключом, так как ключ-1 перейдет в раздел-0, ключ-2 перейдет в раздел-1. Со старым API есть способ достичь, как нам нужно реализовать интерфейс Partition, но как я могу сделать это с помощью нового API. спасибоKafka: Как достичь Round Robin Partition в Kafka

ответ

0

С новым продюсером вы также можете реализовать интерфейс Partitioner (https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/Partitioner.java) для достижения кругового распределения.

Вы можете использовать DefaultPartitioner для справки - https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java

0

Вы можете производить Кафки в циклическом переопределении default partitioner от производителя Кафки.

Реализация псевдо

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 

Над реализацией это чисто циклическое, если вы хотите, чтобы сообщения будут упорядочены в соответствии с ключами и имеют циклический вам придется делать больше в пользовательском секционирования.

+0

Это самое простое решение, но оно не будет работать, если вы добавите раздел во время выполнения, который является полностью действительным случае – serejja

+0

True..you придется перезапустить производитель или опрос периодически для метаданных изменения. Бюст большинства существующих ключевых производителей будет иметь такую ​​же проблему IIRC. –

0

Если вы хотите работать с круговым движением, просто не передавайте ключ при записи в Продюсер, а DefaultPartitioner выполнит эту работу за вас. Вам не нужно писать пользовательскую реализацию. Из 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 
*/