web-dev-qa-db-ja.com

トピック、パーティション、キー

私はこの主題に関するいくつかの明確化を探しています。 Kafka documentationsで私は以下を見つけました:

Kafkaは、トピック内の異なるパーティション間ではなく、パーティション内のメッセージの全体的な順序のみを提供します。ほとんどのアプリケーションでは、キーごとにデータをパーティション化する機能と組み合わせたパーティションごとの順序で十分です。ただし、メッセージ全体の注文が必要な場合は、パーティションが1つしかないトピックでこれを実現できますが、これはコンシューマグループごとに1つのコンシューマプロセスのみを意味します。

だからここに私の質問があります:

  1. (同じグループの)複数のコンシューマーに複数のパーティションが必要な1つのトピックを読んでもらいたいということですか?

  2. 同じグループのコンシューマーの量と同じ量のパーティションが必要ということですか?

  3. 1つのパーティションから何人のコンシューマーを読み取ることができますか?

また、APIに関するキーとパーティションの関係についても質問があります。私は.net API(特にMSのAPI)だけを見ましたが、まねたJava API。消費者がトピックから読み取る場合、パーティション番号があります。

  1. パーティションはどのように番号付けされますか? 0または1から始めますか?
  2. キーとパーティションの正確な関係は何ですか?私が理解しているように、キーに関するいくつかの機能がパーティションを決定します。あれは正しいですか?
  3. トピックに2つのパーティションがあり、特定のメッセージを1つのパーティションに送り、他のメッセージを別のパーティションに送りたい場合、特定のパーティションに特定のキーを使用し、残りを別のパーティションに使用する必要がありますか?
  4. 特定のパーティションに3つのパーティションと1つのタイプのメッセージがあり、残りを他の2つのパーティションにある場合はどうなりますか?
  5. 一般に、どこから読むかを消費者に知らせるために、特定のパーティションにメッセージを送信するにはどうすればよいですか?または、複数のトピックを使用した方が良いですか?

前もって感謝します。

19
Igor K.

イゴール、

パーティションは、Kafkaトピックの並列性を高めます。任意の数のコンシューマ/プロデューサが同じパーティションを使用できます。プロトコルを定義するアプリケーション層まで。 Kafkaは配信を保証します。 APIについては、Javaドキュメントがより完全な場合があるため、参照することをお勧めします。私の経験に基づいて:

  1. パーティションは0から始まります
  2. キーを使用して、同じパーティションにメッセージを送信できます。たとえば、hash(key)%num_partition。ロジックはProducerにプラグイン可能です。 https://kafka.Apache.org/090/javadoc/index.html?org/Apache/kafka/clients/producer/Partitioner.html
  3. はい。ただし、「専用」パーティションになるようなキーにならないように注意してください。このために、専用のトピックが必要な場合があります。たとえば、制御トピックとデータトピック
  4. これは3と同じ質問のようです。
  5. 私は、消費者はパーティションに基づいてデータを仮定すべきではないと考えています。典型的なアプローチは、トピックの複数のパーティションから読み取ることができるコンシューマーグループを持つことです。専用のチャンネルが必要な場合は、個別のトピックを使用することをお勧めします(安全/保守可能)。
14
YaRiK

(同じグループの)複数のコンシューマーに複数のパーティションが必要な1つのトピックを読んでもらいたいということですか?

Kafkaの次のプロパティを見てみましょう。

  • 各パーティションはグループ内のちょうど1つのコンシューマーによって消費されます
  • グループ内の1つのコンシューマーは複数のパーティションを消費できます
  • グループ内のコンシューマプロセスの数は、パーティションの数<=でなければなりません

これらのプロパティにより、kafka=は、コンシューマプロセスのプールでordering guaranteesload balancingの両方をスマートに提供できます。

質問に答えるには、はい、同じグループのコンテキストで、N consumersが必要な場合は、at least N partitionsが必要です。

同じグループのコンシューマーの量と同じ量のパーティションが必要ということですか?

これは最初の答えで説明されたと思います。

1つのパーティションから何人のコンシューマーを読み取ることができますか?

1つのパーティションから読み取ることができるnumber of consumersは、そのトピックにサブスクライブしているnumber of consumer groupsと常に同じです。

APIに関するキーとパーティションの関係

まず、producerがトピック内のどのパーティションにどのレコードを割り当てるかを選択する責任があることを理解する必要があります。

ここで、プロデューサーがどのように行うかを見てみましょう。まず、ProducerRecord.Javaのクラス定義を見てみましょう:

public class ProducerRecord<K, V> {

    private final String topic;
    private final Integer partition;
    private final Headers headers;
    private final K key;
    private final V value;
    private final Long timestamp;

}

ここで、クラスから理解する必要があるフィールドはpartitionです。

ドキュメントから、

  • 有効なpartition numberが指定されている場合、そのpartitionはレコードの送信時に使用されます。
  • パーティションが指定されていないが、keyが存在する場合、hash of the keyを使用してパーティションが選択されます。
  • keypartitionも存在しない場合、パーティションはround-robin fashionに割り当てられます。
21
oblivion