web-dev-qa-db-ja.com

ETL in Java Spring Batch vs Apache Spark=ベンチマーク

私はApacheと一緒に働いてきましたSpark + Scala(Scala $ ====アカデミックおよびプロフェッショナルな経験)。私はいつもSpark/Scalaがあらゆる種類のバッチまたはストリーミングETL/ELTアプリケーションを構築するための堅牢なコンボ。

しかし最近、私のクライアントは2つの主要なパイプラインにJava Spring Batchを使用することにしました。

  1. MongoDBから読み取る->ビジネスロジック-> JSONファイルに書き込む(〜2GB | 600k行)
  2. 読み取りCassandra->ビジネスロジック-> JSONファイルの書き込み(〜4GB | 2M行)

このエンタープライズレベルの決定にはかなり困惑しました。業界には私の心よりも大きな心があることに同意しますが、この動きをする必要性を理解することができませんでした。

私の質問は次のとおりです:

  1. Apache SparkとJava Spring Batch?
  2. Sparkに比べてSpring Batchを使用する利点は何でしょうか?
  3. Apache Batchと比較すると、Spring Batchは「真に分散」していますか? 公式ドキュメント でchunk()、partitionなどのメソッドに遭遇しましたが、その真の分散性については確信がありませんでした。すべてのSpring Batchが単一のJVMインスタンスで実行された後。じゃない?

私はこれらに頭を包むことができません。そこで、このプラットフォームを使用して、Spring BatchとApache Sparkの間の公開討論を行いたいと思います。

8
underwood

Spring Batchプロジェクトのリーダーとして、特定の視点があることをご理解いただけると思います。ただし、開始する前に、ここで説明しているフレームワークは、2つの非常に異なるユースケース用に設計されたものであることをお伝えします。 Spring Batchは、JVMでの従来のエンタープライズバッチ処理を処理するように設計されました。エンタープライズバッチ処理で一般的な場所であるよく理解されているパターンを適用し、JVMのフレームワークでそれらを便利にするように設計されました。一方、Sparkは、ビッグデータおよび機械学習のユースケース向けに設計されました。これらのユースケースには、従来のエンタープライズバッチシステムとは異なるパターン、課題、目標があり、フレームワークの設計に反映されています。そうは言っても、ここにあなたの特定の質問に対する私の答えがあります。

Apache SparkとJava Spring Batchのパフォーマンスを比較した人はいますか?

誰もあなたのためにこの質問に本当に答えることはできません。パフォーマンスベンチマークは非常に具体的なものです。ユースケースは重要です。ハードウェアが重要です。独自のベンチマークとパフォーマンスプロファイリングを行って、展開トポロジのユースケースに最適なものを判断することをお勧めします。

SparkよりもSpring Batchを使用する利点は何ですか?

他のエンタープライズワークロードと同様のプログラミングモデル
企業は、アーキテクチャを決定する際に手元にあるリソースを認識する必要があります。新しいテクノロジーXを使用することは、テクノロジーYのオーバーヘッドを再トレーニングまたは採用する価値がありますか? Spark対Spring Batchの場合、Spring Batchでの既存のSpring開発者の増加はごくわずかです。 Springに慣れている開発者なら誰でも、Spring Batchで完全に生産的にすることができます。 Sparkは、Sparkフレームワークを学習するオーバーヘッドだけでなく、Sparkを予測するためのすべての関連技術のため、平均的なエ​​ンタープライズ開発者にとって学習曲線が急勾配です。そのエコシステムでの仕事(HDFS、Oozieなど)。

専用のインフラストラクチャは不要
分散環境で実行する場合、YARN、Mesos、またはSparkの独自のクラスタリングインストールを使用してクラスターを構成する必要があります(この記事の執筆時点では、実験的なKubernetesオプションがありますが、実験的としてラベル付けされています)。これには、特定のユースケース専用のインフラストラクチャが必要です。 Spring Batchは、あらゆるインフラストラクチャに展開できます。 Spring Bootを介して実行可能JARファイルを使用して実行し、サーブレットコンテナまたはアプリケーションサーバーに展開し、YARNまたは任意のクラウドプロバイダーを介してSpring Batchジョブを実行できます。さらに、Spring Bootの実行可能JARコンセプトを使用する場合、他のワークロードを実行する同じクラウドベースのインフラストラクチャで分散アプリケーションを実行する場合でも、事前にセットアップする必要はありません。

追加のすぐに使えるリーダー/ライターにより、ジョブの作成が簡単になります
Sparkエコシステムは、ビッグデータのユースケースに焦点を当てています。そのため、すぐに読み取りおよび書き込み用に提供されるコンポーネントは、これらのユースケースに焦点を合わせています。ビッグデータのユースケースで一般的に使用されるファイルを読み込むためのさまざまなシリアル化オプションなどは、ネイティブに処理されます。ただし、トランザクション内のレコードのチャンクなどの処理はそうではありません。

一方、Spring Batchは、宣言型の入出力のためのコンポーネントの完全なスイートを提供します。フラットファイル、XMLファイル、データベース、NoSQLストア、メッセージングキュー、電子メールの読み書きなど、リストが続きます。 Spring Batchは、これらすべてをそのまま使用できます。

Sparkはビッグデータ用に構築されました...すべてのユースケースがビッグデータのユースケースであるわけではありません
要するに、Sparkの機能は、ビッグデータと機械学習のために構築されたドメインに固有のものです。トランザクション管理(またはトランザクション)のようなものはSparkには存在しません。エラーが発生したときにロールバックするというアイデアは、カスタムコードなしでは存在しません(私の知る限り)。フレームワークのレベルでは、スキップ/再試行などのより堅牢なエラー処理のユースケースは提供されません。 Sparkでは、再起動などの状態管理は、Spring Batchよりもはるかに重いです(特定のコンポーネントのRDD全体を保持し、些細な状態を保存する)。これらの機能はすべて、Spring Batchのネイティブ機能です。

Spring Batchは「本当に配布されています」

Spring Batchの利点の1つは、バッチプロセスを、単純に連続して実行される単一のJVMプロセスから、最小限の変更で完全に分散されたクラスター化されたソリューションに進化させることができることです。 Spring Batchは2つの主要な分散モードをサポートしています:

  1. リモートパーティショニング-ここで、Spring Batchはマスター/ワーカー構成で実行されます。マスターは、オーケストレーションのメカニズムに基づいて作業者に作業を委任します(多くのオプションがここにあります)。このアプローチでは、リモートJVMへの最小限のネットワークオーバーヘッド(各パーティションのみを記述するメタデータの送信)を使用して、完全な再起動性、エラー処理などをすべて利用できます。 Spring Cloud Taskは、Spring Batchの拡張機能も提供します。これにより、クラウドネイティブメカニズムでワーカーを動的に展開できます。
  2. リモートチャンキング-リモートチャンクは、ステップの処理フェーズと書き込みフェーズのみをリモートJVMに委任します。まだマスター/ワーカー構成を使用して、マスターは、処理と書き込みのためにワーカーにデータを提供する責任があります。このトポロジでは、データがネットワーク上を移動するため、ネットワークの負荷が大きくなります。通常、処理の利点が追加されたネットワークトラフィックのオーバーヘッドを超えることができる場合にのみ使用されます。

これらの機能を詳細に説明する他のStackoverflowの回答があります(ドキュメントと同様)。

春バッチの利点
スプリングバッチリモートチャンキングとリモートパーティショニングの違い
Spring Batch Documentation

11
Michael Minella