使っています spark 1.5.2
。 sparkストリーミングジョブをkafkaをストリーミングソースとして実行する必要があります。kafka内の複数のトピックから読み取る必要があります各トピックを異なる方法で処理します。
誰かの参考になるように、私は次のように観察しました。
複数のストリームを作成すると、次の2つの点で役立ちます。1.異なるトピックを別々に処理するためにフィルター操作を適用する必要はありません。 2.複数のストリームを並行して読み取ることができます(単一ストリームの場合は1つずつではありません)。これを行うには、文書化されていない構成パラメーターspark.streaming.concurrentJobs*
があります。そこで、複数のストリームを作成することにしました。
sparkConf.set("spark.streaming.concurrentJobs", "4");
正しい解決策はユースケースに依存すると思います。
処理ロジックがすべてのトピックのデータで同じである場合、間違いなく、これはより良いアプローチです。
処理ロジックが異なる場合、すべてのトピックから単一のRDDを取得し、各処理ロジックに対してpairedrddを作成して個別に処理する必要があると思います。問題は、これにより処理に一種のグループ化が作成され、全体的な処理速度が、処理に最も長い時間を必要とするトピックによって決定されることです。したがって、データが少ないトピックは、すべてのトピックのデータが処理されるまで待機する必要があります。 1つの利点は、その時系列データの場合、処理が一緒に進行することです。これは良いことかもしれません。
独立したジョブを実行するもう1つの利点は、より適切に制御でき、リソース共有を調整できることです。たとえば、トピックを高いスループットで処理するジョブには、より高いCPU /メモリを割り当てることができます。