2016-07-28 8 views
1

私はカフカを新しくしました。私の要件は、私は2つのパーティション、例えばPartition-0とPartition-1を持っており、私もKEY値を含む値のリストを持っています。私はkey-1がPartition-0に、Key-2がPartition-1に行くように私の鍵に従ってデータを保存したい。古いAPIでは、Partitionインターフェースを実装する必要があるように達成する方法がありますが、私は新しいAPIでこれをどうやって行うことができますか?ありがとうカフカ:カフカでラウンドロビンパーティションを達成する方法

答えて

0

ラウンドロビン配信を実現するために、新しいプロデューサでPartitionerインターフェイス(https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/Partitioner.java)を実装することもできます。あなたはカフカプロデューサーのdefault partitionerをオーバーライドすることによって、ラウンドロビン方式でカフカに生成することができますhttps://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java

0

-

あなたは参照用DefaultPartitionerを使用することができます。実装上

疑似実装

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

ラウンドロビンの動作をしたい場合は、Producerに書き込むときにキーを渡さないでください。DefaultPartitionerがあなたのために機能します。カスタム実装を書く必要はありません。 Javadocから:

/** 
* 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 
*/ 
関連する問題