Kafkaコンシューマーのリバランスアルゴリズムについて教えてください。パーティション数とコンシューマースレッドがこれにどのように影響するかを理解したいと思います。
ありがとうございました、
さて、現時点では2つのリバランスアルゴリズムがあります-Range
とRoundRobin
。これらは、パーティション割り当て戦略とも呼ばれます。
簡単にするために、10個のパーティションを持つトピック_T1
_があり、異なる構成の2つのコンシューマーもあると仮定します(例をより明確にするため)-_C1
_を_num.streams
_に設定した_1
_ )__および_C2
_、_num.streams
_は_2
_に設定されます。
これがRange
戦略でどのように機能するかを次に示します。
Rangeは、使用可能なパーティションを番号順に、コンシューマースレッドを辞書式順序でレイアウトします。したがって、この場合、パーティションの順序は_0, 1, 2, 3, 4, 5, 6, 7, 8, 9
_になり、コンシューマースレッドの順序は_C1-0, C2-0, C2-1
_になります。次に、パーティションの数をコンシューマスレッドの数で割って、各コンシューマスレッドが所有する必要のあるパーティションの数を決定します。この場合、均等に分割されないため、スレッド_C1-0
_は1つの追加パーティションを取得します。最終的なパーティションの割り当ては次のようになります。
_C1-0
_はパーティションを取得します_0, 1, 2, 3
_
_C2-0
_はパーティションを取得します_4, 5, 6
_
_C2-1
_はパーティションを取得します_7, 8, 9
_
11個のパーティションがある場合、これらのコンシューマーのパーティション割り当ては少し変更されます。
_C1-0
_はパーティションを取得します_0, 1, 2, 3
_
_C2-0
_はパーティションを取得します_4, 5, 6, 7
_
_C2-1
_はパーティションを取得します_8, 9, 10
_
それでおしまい。
RoundRobin
戦略では、このトピックにサブスクライブしているすべてのコンシューマーで等しい_num.streams
_が必要なため、同じ構成は機能しません。したがって、両方のコンシューマーで_num.streams
_が2に設定されていると仮定します。ここでのRange
戦略との大きな違いの1つは、リバランスの前に割り当てがどうなるかを予測できないことです。これがRoundRobin
戦略でどのように機能するかを次に示します。
まず、実際の割り当ての前に満たさなければならない2つの条件があります。
a)すべてのトピックはコンシューマーインスタンス内に同じ数のストリームを持っています(そのため、コンシューマーごとに異なるスレッド数は機能しないと前述しました)
b)サブスクライブされたトピックのセットは、グループ内のすべてのコンシューマーインスタンスで同一です(ここには1つのトピックがあるため、現在は問題ありません)。
これらの2つの条件が検証されると、_topic-partition
_ペアがハッシュコードでソートされ、1つのトピックのすべてのパーティションが1つのコンシューマーに割り当てられる可能性が低くなります(消費されるトピックが複数ある場合)。
そして最後に、すべての_topic-partition
_ペアは、ラウンドロビン方式で使用可能なコンシューマスレッドに割り当てられます。たとえば、トピックパーティションが_T1-5, T1-3, T1-0, T1-8, T1-2, T1-1, T1-4, T1-7, T1-6, T1-9
_のように並べ替えられ、コンシューマスレッドが_C1-0, C1-1, C2-0, C2-1
_の場合、割り当ては次のようになります。
_T1-5
_は_C1-0
_に移動します
_T1-3
_は_C1-1
_に移動します
_T1-0
_は_C2-0
_に移動します
_T1-8
_は_C2-1
_に移動します
この時点では、コンシューマースレッドは残っていませんが、トピックパーティションはまだ残っているため、コンシューマースレッドの反復は最初からやり直します。
_T1-2
_は_C1-0
_に移動します
_T1-1
_は_C1-1
_に移動します
_T1-4
_は_C2-0
_に移動します
_T1-7
_は_C2-1
_に移動します
そしてまた:
_T1-6
_は_C1-0
_に移動します
_T1-9
_は_C1-1
_に移動します
この時点で、すべてのトピックパーティションが割り当てられ、各コンシューマスレッドにはほぼ同じ数のパーティションがあります。
お役に立てれば。
これを読むことができますKafka docs http://kafka.Apache.org/documentation/#impl_brokerregistration 消費者登録アルゴリズムと消費者リバランスアルゴリズムについて
それが言ったように、各消費者はリバランス中に次のことをします:
1. For each topic T that C<sub>i</sub> subscribes to
2. let P<sub>T</sub> be all partitions producing topic T
3. let C<sub>G</sub> be all consumers in the same group as C<sub>i</sub> that consume topic T
4. sort P<sub>T</sub> (so partitions on the same broker are clustered together)
5. sort C<sub>G</sub>
6. let i be the index position of C<sub>i</sub> in C<sub>G</sub> and let N = size(P<sub>T</sub>)/size(C<sub>G</sub>)
7. assign partitions from i*N to (i+1)*N - 1 to consumer C<sub>i</sub>
8. remove current entries owned by C<sub>i</sub> from the partition owner registry
9. add newly assigned partitions to the partition owner registry
(we may need to re-try this until the original partition owner releases its ownership)
また、次の点にも注意してください。
パーティションよりも多くのコンシューマーがある場合、一部のコンシューマーはデータをまったく取得しません。リバランス中に、各コンシューマーが接続する必要のあるブローカーノードの数を減らすような方法で、コンシューマーにパーティションを割り当てようとします。