web-dev-qa-db-ja.com

Spark:複数のkafkaトピックを並行して処理します

使っています spark 1.5.2。 sparkストリーミングジョブをkafkaをストリーミングソースとして実行する必要があります。kafka内の複数のトピックから読み取る必要があります各トピックを異なる方法で処理します。

  1. 同じ仕事でこれを行うのは良い考えですか?その場合、トピックごとに複数のパーティションまたは異なるストリームを持つ単一のストリームを作成する必要がありますか?
  2. 私はkafka直接Steamを使用しています。私が知る限り、sparkは各パーティションで長時間実行されるレシーバーを起動します。比較的小さなクラスター、6ノードの各4コア。各トピックに多くのトピックとパーティションがある場合、ほとんどのエグゼキューターが長時間実行されるレシーバーでビジーになるため、効率に影響がありますか?ここで私の理解が間違っている場合は修正してください
20
nish

誰かの参考になるように、私は次のように観察しました。

  1. kafkaダイレクトストリームでは、レシーバーは実行時間の長いタスクとして実行されません。各バッチの開始時に、最初にexecutorでkafka=読み取りが完了すると、処理部分が処理を引き継ぎます。
  2. 複数のトピックを含む単一のストリームを作成する場合、トピックは次々に読み込まれます。また、異なる処理ロジックを適用するためにdstreamをフィルタリングすると、ジョブに別のステップが追加されます
  3. 複数のストリームを作成すると、次の2つの点で役立ちます。1.異なるトピックを別々に処理するためにフィルター操作を適用する必要はありません。 2.複数のストリームを並行して読み取ることができます(単一ストリームの場合は1つずつではありません)。これを行うには、文書化されていない構成パラメーターspark.streaming.concurrentJobs*があります。そこで、複数のストリームを作成することにしました。

    sparkConf.set("spark.streaming.concurrentJobs", "4");
    
19
nish

正しい解決策はユースケースに依存すると思います。

処理ロジックがすべてのトピックのデータで同じである場合、間違いなく、これはより良いアプローチです。

処理ロジックが異なる場合、すべてのトピックから単一のRDDを取得し、各処理ロジックに対してpairedrddを作成して個別に処理する必要があると思います。問題は、これにより処理に一種のグループ化が作成され、全体的な処理速度が、処理に最も長い時間を必要とするトピックによって決定されることです。したがって、データが少ないトピックは、すべてのトピックのデータが処理されるまで待機する必要があります。 1つの利点は、その時系列データの場合、処理が一緒に進行することです。これは良いことかもしれません。

独立したジョブを実行するもう1つの利点は、より適切に制御でき、リソース共有を調整できることです。たとえば、トピックを高いスループットで処理するジョブには、より高いCPU /メモリを割り当てることができます。

6
Atul Soman