Kafka:コンシューマーAPIとストリームAPI


102

私は最近カフカを学び始め、これらの質問に行き着きました。

  1. コンシューマーとストリームの違いは何ですか?私にとって、ツール/アプリケーションがKafkaからのメッセージを消費する場合、Kafkaの世界の消費者です。

  2. これはKafkaからのメッセージを消費したり、Kafkaへのメッセージを生成したりするため、Streamはどのように異なりますか?また、Consumer APIを使用して独自のコンシューマーアプリケーションを作成し、必要に応じて処理したり、コンシューマーアプリケーションからSparkに送信したりできるのに、なぜ必要なのですか?

私はこれについてグーグルをしましたが、これについて良い答えは得られませんでした。この質問が些細なことである場合は申し訳ありません。

回答:


108

2018年4月9日更新:現在、KafkaのイベントストリーミングデータベースであるksqlDBを使用して、Kafkaでデータを処理することもできます。ksqlDBはKafkaのStreamsAPIの上に構築されており、「ストリーム」と「テーブル」のファーストクラスのサポートも付属しています。

ConsumerAPIとStreamsAPIの違いは何ですか?

KafkaのStreamsライブラリ(https://kafka.apache.org/documentation/streams/)は、Kafkaのプロデューサーおよびコンシューマークライアントの上に構築されています。Kafka Streamsは、プレーンクライアントよりもはるかに強力で、表現力もあります。

普通の消費者よりも、Kafka Streamsで最初から最後まで、実際のアプリケーションを作成する方がはるかに簡単で迅速です。

Kafka Streams APIの機能の一部を次に示しますが、そのほとんどはコンシューマークライアントではサポートされていません(不足している機能を自分で実装する必要があり、基本的にKafka Streamsを再実装する必要があります)。

  • Kafkaトランザクションを介した1回限りの処理セマンティクスをサポートします(EOSの意味
  • ストリーミング結合集約ウィンドウ処理など、フォールトトレラントなステートフル(もちろんステートレス)処理をサポートします。つまり、アプリケーションの処理状態の管理をすぐにサポートします。
  • イベント時の処理だけでなく、処理時間取り込み時間に基づく処理もサポートします。また、順不同のデータをシームレスに処理します
  • ストリームとテーブルの両方をファーストクラスでサポートします。これは、ストリーム処理がデータベースと出会う場所です。実際には、ほとんどのストリーム処理アプリケーションは、それぞれのユースケースを実装するためにストリームとテーブルの両方を必要とします。したがって、ストリーム処理テクノロジに2つの抽象化のいずれかがない場合(たとえば、テーブルのサポートがない場合)、行き詰まるか、この機能を自分で手動で実装する必要があります。 (それで頑張ってください...)
  • サポートインタラクティブクエリ(また、「照会可能な状態」と呼ばれる)は、他のアプリケーションやサービスに、最新の処理結果を露出させます
  • より表現ですが付属しています(1)関数型プログラミングスタイルのDSLのような操作でmapfilterreduceだけでなく、(2)が不可欠スタイルプロセッサのAPIなどが複合イベント処理(CEP)を行うため、および(3)あなたも組み合わせることができますDSLとプロセッサAPI。
  • ユニットテストと統合テスト用の独自のテストキットがあります。

Kafka Streams APIの詳細でありながら高レベルの概要については、http://docs.confluent.io/current/streams/introduction.htmlを参照してください。これは、低レベルのKafkaコンシューマーとの違いを理解するのにも役立ちます。クライアント。

Kafka Streams以外に、イベントストリーミングデータベースksqlDBを使用してKafkaでデータを処理することもできます。ksqlDBは、KafkaStreamsの上に構築されています。基本的にKafkaStreamsと同じ機能をサポートしますが、JavaやScalaの代わりにストリーミングSQLを記述します。プログラムで、CLIまたはRESTAPIを介してksqlDBと対話できます。また、RESTを使用したくない場合に備えて、ネイティブJavaクライアントもあります。

では、Kafka Streams APIは、Kafkaからのメッセージを消費したり、Kafkaへのメッセージを生成したりするため、どのように異なりますか?

はい、Kafka Streams APIは、Kafkaへのデータの読み取りと書き込みの両方を行うことができます。Kafkaトランザクションをサポートしているため、たとえば、1つ以上のトピックから1つ以上のメッセージを読み取り、必要に応じて処理状態を更新し、1つ以上のトピックに1つ以上の出力メッセージをすべて1つとして書き込むことができます。アトミック操作。

また、Consumer APIを使用して独自のコンシューマーアプリケーションを作成し、必要に応じて処理したり、コンシューマーアプリケーションからSparkに送信したりできるのに、なぜ必要なのですか?

はい、独自のコンシューマーアプリケーションを作成できます-前述したように、Kafka Streams APIはKafkaコンシューマークライアント(およびプロデューサークライアント)自体を使用します-ただし、StreamsAPIが提供するすべての固有の機能を手動で実装する必要があります。「無料」で入手できるものはすべて、上記のリストを参照してください。したがって、ユーザーがより強力なKafka Streamsライブラリではなく、プレーンなコンシューマクライアントを選択することはかなりまれな状況です。


8
どのような場合、アプリケーションはKafka StreamsAPIではなくKafkaConsumer APIを使用しますか?
bhh19 8818年

4
主に、Kafka ConsumerAPIの下位レベルのメソッドに直接アクセスする必要がある状況。Kafka Streamsが利用可能になったので、これは通常、かなりカスタムの特殊なアプリケーションとユースケースに対して行われます。例えは次のとおりです。KafkaStreamsが車であると想像してください。ほとんどの人はそれを運転したいだけですが、自動車整備士にはなりたくありません。ただし、何らかの理由で車のエンジンを開いて調整したい場合があります。その場合は、ConsumerAPIを直接使用する必要があります。(そうは言っても、Kafka Streamsにはカスタムニーズ用のプロセッサAPIもあります。)
Michael G.Noll18年

1
それらを差別化する主なものは、ストアにアクセスする能力だと思います。ストリーム内でストアを使用することの強みを理解すると、kafkaストリームの力を理解できます。
ヨナタンキロン

25

ETLタイプのメッセージ変換をサポートするために構築されたKafkaStreamコンポーネント。トピックからストリームを入力し、変換して他のトピックに出力することを意味します。リアルタイム処理をサポートすると同時に、集約、ウィンドウ処理、結合などの高度な分析機能をサポートします。

「KafkaStreamsは、Kafkaのプロデューサーライブラリとコンシューマーライブラリを構築し、Kafkaのネイティブ機能を活用して、データの並列処理、分散調整、フォールトトレランス、操作の簡素化を提供することで、アプリケーション開発を簡素化します。」

以下は、KafkaStreamの主要なアーキテクチャ機能です。こちらをご参照ください

  1. ストリームパーティションとタスク:Kafka Streamsは、パーティションとタスクの概念を、Kafkaトピックパーティションに基づく並列処理モデルの論理ユニットとして使用します。
  2. スレッドモデル: Kafka Streamsを使用すると、ユーザーは、ライブラリがアプリケーションインスタンス内の処理を並列化するために使用できるスレッドの数を構成できます。
  3. ローカルステートストア:Kafka Streamsは、いわゆるステートストアを提供します。これは、ストリーム処理アプリケーションがデータを格納およびクエリするために使用できます。これは、ステートフル操作を実装する際の重要な機能です。
  4. フォールトトレランス: Kafka Streamsは、Kafka内にネイティブに統合されたフォールトトレランス機能に基づいて構築されています。Kafkaパーティションは高可用性と複製が可能であるため、ストリームデータがKafkaに永続化されると、アプリケーションに障害が発生して再処理する必要がある場合でも利用できます。

以下の私の理解に基づいて、ポイントが欠落している、または誤解を招く場合は更新することができます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

コンシューマーを使用する場所-プロデューサー:

  1. 単一のコンシューマーが存在する場合は、メッセージプロセスを消費しますが、他のトピックにはこぼさないでください。
  2. ポイント1として、プロデューサーがメッセージを作成するだけの場合、KafkaStreamは必要ありません。
  3. 1つのKafkaクラスターからのコンシューマーメッセージであるが、異なるKafkaクラスタートピックに公開する場合。その場合、Kafka Streamを使用することもできますが、メッセージを異なるクラスターに公開するには、別のプロデューサーを使用する必要があります。または、単にKafkaConsumer-Producerメカニズムを使用します。
  4. バッチ処理-メッセージを収集する必要がある場合、またはバッチ処理の種類がある場合は、通常の従来の方法を使用することをお勧めします。

Kafka Streamを使用する場所:

  1. 1つのトピックからのメッセージを消費する場合は、KafkaStreamを変換して他のトピックに公開するのが最適です。
  2. リアルタイム処理、リアルタイム分析、機械学習。
  3. 集約、結合ウィンドウなどのステートフルトランスフォーメーション。
  4. ローカルステートストアまたはPortworxなどのマウントされたステートストアの使用を計画しています。
  5. 正確に1つの処理セマンティックおよび自動定義のフォールトトレランスを実現します。

1
素晴らしい、本当に役に立ちましたが、大きな間違いが1つあります。ConsumerとStreams apiの両方でセマンティックが利用可能になっただけでなく、EOSは下位レベルのコンシューマー/プロデューサー向けの設定の集まりであり、この設定は特定の値と組み合わせてグループ化されます。 EOSの動作を保証します。現在、私は問題なくコンシューマーAPIでEOSを使用しています。
uptoyou

そうです、プロパティを設定することで、Kafka Streamでセマンティックを1回だけ定義できますが、単純なプロデューサーとコンシューマーの場合、単位トランザクションとしてサポートするべき等とトランザクションを定義する必要があります
sun007

提案に従って文言を変更しました
sun0 0719

@ sun007、リアルタイム機能を必要としない単純なアプリケーションの方が高速ですか?また、ストリーミングを使用すると、kafkaのネイティブ機能に加えて、他の高レベルのツールと同様に「余分な」変換オーバーヘッドが追加されますか?
ナグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.