web-dev-qa-db-ja.com

Apache SamzaとApache Kafka Streamsの違い(並列処理と通信に焦点を当てる))

SamzaおよびKafkaストリームでは、データストリーム処理はシーケンス/グラフ(Samzaでは「データフローグラフ」と呼ばれ、Kafkaストリーム)処理ステップ(Samzaでは「ジョブ」と呼ばれ、Kafkaストリームでは「プロセッサ」と呼ばれます)。これら2つの用語をワークフローと呼びます。この質問の残りの部分では、およびworkerです。

非常に単純なワークフローがあるとします。ワークフローは、センサー測定値を消費して50未満のすべての値をフィルターするワーカーAに続き、残りの測定値を受け取って80を超えるすべての値をフィルターするワーカーBで構成されています。

入力(カクファトピックX)->(ワーカーA)->(ワーカーB)->出力(カフカトピックY)

私が理解した場合

正しく、SamzaとKafkaの両方のストリームは、ワークフロー/ワーカーを複製し、スケーラビリティを目的として処理を並列化するために、トピック分割の概念を使用しています。

だが:

  • Samzaは、各ワーカー(つまり、ジョブ)を別々に複数のタスクに複製します(入力ストリームのパーティションごとに1つ)。つまり、タスクはワークフローのワーカーのレプリカです。

  • Kafka Streamsは、ワークフロー全体(トポロジなど)を複数のタスク(入力ストリームのパーティションごとに1つ)に一度に複製します。つまり、タスクはワークフロー全体のレプリカです。

これは私に私の質問をもたらします:

  1. パーティションが1つしかないと想定します。サムザでは可能ですが、ワーカー[A]と(B)をKafka St​​reamsの2つの異なるマシンにデプロイすることはできませんか? (または言い換えると、Kafka St​​reamsでは、複数のパーティションがあるかどうかに関係なく、単一のタスク(つまり、トポロジーレプリカ)を2つのマシンに分割することは不可能ですか?)

  2. Kafka St​​reamsトポロジの後続の2つのプロセッサは(同じタスクで)どのように通信しますか? (Samzaでは、2つの後続のワーカー(つまり、ジョブ)間のすべての通信はKafkaトピックで行われますが、Kafkaで「マーク」する必要があるためストリームをKafkaトピックとして公開する必要があるコードで明示的にストリームすることはできません)。

  3. Samzaはすべての中間ストリームもKafkaトピックとして自動的に公開します(したがって、潜在的なクライアントが利用できるようにします)Kafkaストリームはそれらの中間ストリームのみを公開し、明示的にマークする最終ストリーム(低レベルAPIのaddSinkおよびDSLのtoまたはthroughを使用)?

(SamzaはKafka以外のメッセージキューも使用できることを知っていますが、これは私の質問にはあまり関係ありません。)

20
Lukas Probst

まず、両方のSamzaとKafka Streamsでは、これらの2つのタスク(プロセッサ)の間に中間トピックを含めるかどうか、つまりトポロジを選択することができます。次のいずれかになります。

入力(カクファトピックX)->(ワーカーA)->(ワーカーB)->出力(カフカトピックY)

または:

入力(カクファトピックX)->(ワーカーA)->中級(カフカトピックZ)->(ワーカーB)->出力(カフカトピックY)

SamzaまたはKafka Streamsでは、前者の場合はワーカーAとBを一緒にデプロイする必要がありますが、後者の場合はワーカーAをデプロイできません。またはBは、どちらかのフレームワークタスクと同様に、中間トピックを介してのみ通信し、TCPベースの通信チャネルはありません。

Samzaでは、前者の場合は2つのフィルターを1つのタスクのようにコーディングする必要があり、後者の場合は各タスクの入力トピックと出力トピックを指定する必要があります。ワーカーAの入力はX、出力はZ、ワークBの入力はZ、出力はYであり、デプロイされたワーカーを個別に開始/停止できます。

Kafkaストリームでは、前者の場合、これらのプロセッサを次のように「連結」することができます

stream1.filter(..).filter(..)

そして、ルーカスが言ったような結果として、最初のフィルターからの各結果はすぐに2番目のフィルターに渡されます(トピックXからの各入力レコードは、深さ優先順でトポロジーをトラバースするものと考えることができ、直接の間にバッファリングはありません。接続されたプロセッサ);

後者の場合、中間ストリームが別のトピックで「具体化」されることを示すことができます。

stream1.filter(..).through("topicZ").filter(..)

そして、最初のフィルターの各結果はトピックZに送信され、次にトピックZが2番目のフィルタープロセッサにパイプライン処理されます。この場合、これらの2つのフィルターは、同じホスト内の異なるホストまたは異なるスレッドに展開できる可能性があります。

9
Guozhang Wang