web-dev-qa-db-ja.com

Kafka Stream StateStoreはすべてのインスタンスでグローバルですか、それともローカルですか?

Kafka Stream WordCountの例では、StateStoreを使用してワードカウントを格納します。同じコンシューマーグループに複数のインスタンスがある場合、StateStoreはグループに対してグローバルですか、それともコンシューマーインスタンスに対してローカルですか?

Thnaks

8
Stephen Kuo

これは、州の店舗に対するあなたの見方によって異なります。

  1. Kafka Streamsでは状態が共有されるため、各インスタンスはアプリケーション全体の状態の一部を保持します。たとえば、DSLステートフルオペレーターを使用すると、ローカルのRocksDBインスタンスを使用して状態のシャードを保持します。この点で、州は地方です。

  2. 一方、状態へのすべての変更はKafkaトピックに書き込まれます。このトピックは、アプリケーションホストではなく、Kafkaクラスターであり、複数のパーティションで構成されており、複製できます。エラーが発生した場合、この変更ログトピックは、実行中の別のインスタンスで障害が発生したインスタンスの状態を再作成するために使用されます。グローバルであると見なされます。

変更ログはアプリケーション状態のtruthであり、ローカルストアは基本的に状態のシャードのキャッシュであることに注意してください。

さらに、WordCountの例では、レコードストリーム(データストリーム)が単語で分割され、1つの単語のカウントが単一のインスタンスによって維持されます(異なるインスタンスが異なる単語のカウントを維持します)。

アーキテクチャの概要については、 http://docs.confluent.io/current/streams/architecture.html をお勧めします。

また、このブログ投稿は興味深いはずです http://www.confluent.io/blog/unifying-stream-processing-and-interactive-queries-in-Apache-kafka/

18
Matthias J. Sax

GlobalKTable改善提案 があることを言及する価値がある場合

GlobalKTableは、KafkaStreamsインスタンスごとに1回完全に複製されます。つまり、各KafkaStreamsインスタンスは、対応するトピックのすべてのパーティションを消費します。

Confluent Platformのメーリングリストから、この情報を入手しました

Kafka 0.10.2(またはトランク)ブランチ...を使用してプロトタイピングを開始できます。

0.10.2-rc0にはすでにGlobalKTableがあります!

これが 実際のPR です。

そして、それを私に言ったのはマティアスJ.サックスでした;)

3
hakamairi

GlobalStateStoreからデータを検索するユースケースがある場合は常に、入力トピックで実行するすべての変換に対して、Transformerの代わりにProcessorを使用します。 context.forward(key,value,childName)を使用して、データをダウンストリームノードに送信します。 context.forward(key,value,childName)process()およびpunctuate()で複数回呼び出され、複数のレコードをダウンストリームノードに送信できます。 GlobalStateStoreを更新する必要がある場合は、addGlobalStore(..)に渡されるProcessorでのみこれを実行します。GlobalStateStoreに関連付けられたGlobalStreamThreadがあり、ストアの状態をすべてのユーザーで一貫性のある状態に保つためです。実行中のkstreamインスタンス。

1
Piyush Verma