Kafka Stream WordCount
の例では、StateStore
を使用してワードカウントを格納します。同じコンシューマーグループに複数のインスタンスがある場合、StateStore
はグループに対してグローバルですか、それともコンシューマーインスタンスに対してローカルですか?
Thnaks
これは、州の店舗に対するあなたの見方によって異なります。
Kafka Streamsでは状態が共有されるため、各インスタンスはアプリケーション全体の状態の一部を保持します。たとえば、DSLステートフルオペレーターを使用すると、ローカルのRocksDBインスタンスを使用して状態のシャードを保持します。この点で、州は地方です。
一方、状態へのすべての変更は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/
GlobalKTable改善提案 があることを言及する価値がある場合
GlobalKTableは、KafkaStreamsインスタンスごとに1回完全に複製されます。つまり、各KafkaStreamsインスタンスは、対応するトピックのすべてのパーティションを消費します。
Confluent Platformのメーリングリストから、この情報を入手しました
Kafka 0.10.2(またはトランク)ブランチ...を使用してプロトタイピングを開始できます。
0.10.2-rc0にはすでにGlobalKTableがあります!
これが 実際のPR です。
そして、それを私に言ったのはマティアスJ.サックスでした;)
GlobalStateStoreからデータを検索するユースケースがある場合は常に、入力トピックで実行するすべての変換に対して、Transformerの代わりにProcessorを使用します。 context.forward(key,value,childName)
を使用して、データをダウンストリームノードに送信します。 context.forward(key,value,childName)
はprocess()
およびpunctuate()
で複数回呼び出され、複数のレコードをダウンストリームノードに送信できます。 GlobalStateStoreを更新する必要がある場合は、addGlobalStore(..)
に渡されるProcessorでのみこれを実行します。GlobalStateStoreに関連付けられたGlobalStreamThreadがあり、ストアの状態をすべてのユーザーで一貫性のある状態に保つためです。実行中のkstreamインスタンス。