Project Lightspeed Update - Apache Spark Structured Streamingの高度化に向けて
翻訳:Saki Kitaoka. - Original Blog Link
このブログポストでは、1年前にProject Lightspeedを発表してからのSpark Structured Streamingの進歩について、パフォーマンスの向上からエコシステムの拡張、そしてそれ以降についてレビューします。具体的なイノベーションについて説明する前に、そもそも私たちがProject Lightspeedの必要性に至った背景を少しおさらいしましょう。
本記事の背景
ストリーム処理は、インスタントな洞察とリアルタイムのフィードバックを得るために、企業にとって重要なニーズです。Apache Spark Structured Streamingは、その使いやすさ、パフォーマンス、大規模なエコシステム、開発者コミュニティにより、長年にわたって最も人気のあるオープンソースのストリーミングエンジンです。オープンソースで組織全体に広く採用されており、Delta Live Tables(DLT)やDatabricks Lakehouse Platformのストリーミングを支える中核技術です。
当社の顧客は、ストリーミングデータを使用して、記録的な価格とパフォーマンスで驚くべきことを行っています:
Columbiaは、Databricks上でリアルタイム分析パイプラインを構築し、以前のデータウェアハウスベースのプラットフォームよりも48倍高速なETLワークロードを低コストで実現しました。
AT&T, LaLiga, USDOTは、リアルタイムMLのユースケースをわずかなコストと複雑さで変革しました。
Walgreens社は、BIワークロードをレガシーデータウェアハウスアーキテクチャからSpark Structured Streamingで構築されたリアルタイム分析ソリューションに進化させることで、サプライチェーンコストを数百万ドル削減しました。
Honeywell社とEdmunds社は、SparkとDLTで構築されたより高性能で低コストのETLパイプラインにより、リアルタイムアプリケーションを強化しました。
実際、Databricks Lakehouse Platformは、リアルタイムアナリティクス、リアルタイムAIおよびML、リアルタイムアプリケーションを強化するストリーミングデータワークロードとして、何千もの顧客に信頼されています。Databricks上で実行されるストリーミングジョブは週に1,000万を超え、その数は毎年2.5倍以上のペースで増え続けています。これらのジョブは、1日に数ペタバイトのデータ(圧縮データ)を処理しています。
Project Lightspeed
2022年のData+AI Summitで、私たちはApache Sparkを使ったより高速でシンプルなストリーム処理に特化したイニシアチブであるProject Lightspeedを発表しました。Lightspeedは、未来のストリーミングエンジン としてのSparkと、Sparkワークロードを実行するための最適な場所としてのDatabricks Lakehouse Platformへの協調的な投資を表しており、また、すべてのデータの必然的な未来としてストリーミングデータアーキテクチャを認めています。
Project Lightspeedは、4つの異なる領域で構造化ストリーミングに進歩をもたらしました。これらはすべて、Apache Spark Structured StreamingとDatabricks Runtimeが複雑なリアルタイムデータワークロードの処理をますます向上させることを目的としています。
以下は、Project Lightspeedのここ1年の新機能を領域別にまとめたものです:
この投稿では、Project Lightspeedがこれまでにもたらしたすべての変更点を探ります。新しいレイテンシーの改善から、Amazon KinesisやGoogle Pub/Subのような一般的なメッセージング・システム用の改良されたコネクターまで、すべてをカバーします。
領域 1 - パフォーマンスの向上
Sparkの設計は、高いスループットと使いやすさを低コストで実現する一方で、秒以下のレイテンシには最適化されていませんでした。私たちは、一貫性のあるサブ秒レイテンシーを実現するために、いくつかのテクニックと機能を実装しました。これらの改善は以下の通りです。
Offset の管理
Apache Spark Structured Streamingは、データがどの時点まで処理されたかを追跡するために、オフセットの永続化と管理に依存しています。これは、各マイクロバッチに対して2つの帳簿管理操作に変換されます。
- マイクロバッチの開始時に、ソースシステムから読み込める新しいデータに基づいてオフセットが計算され、offsetLogと呼ばれる耐久性のあるログに永続化されます。
- マイクロバッチの終了時には、このマイクロバッチが正常に処理されたことを示すエントリが commitLog と呼ばれる耐久性のあるログに永続化されます。
以前は、これらの操作は両方ともデータ処理のクリティカルパス上で実行され、処理の待ち時間とクラスタの使用率に大きな影響を与えていました。
オフセットを永続化するこのオーバーヘッドに対処するため、Project Lightspeedに非同期の進捗追跡を実装しました。この実装により、Structured Streamingパイプラインは、マイクロバッチ内の実際のデータ処理と並行して、非同期にログを更新することができます。パフォーマンス実験では、100K、500K、1Mイベント/秒のスループットで、レイテンシが700~900ミリ秒から150~250ミリ秒に一貫して3倍削減されました。
Availability - この機能はDBR11.3以降のリリースから利用可能です。
詳細については、以下のブログをご参照ください。
- Apache Spark Structured Streamingでレイテンシが1秒未満になりました
ログのパージ
プログレス・トラッキングのオフセット管理に加えて、以前は Structured Streaming はマイクロバッチごとにクリーンアップ処理を実行していました。このオペレーションは、プログレス・トラッキングの古くて不要なログ・エントリーを削除または切り捨て、これらのログが蓄積されて無制限に増大しないようにします。この操作は、レイテンシに影響を与えるデータの実際の処理とインラインで実行されました。
このオーバーヘッドを除去するために、ロ グのクリーンアップはProject Lightspeedで非同期にされ、バックグラウンドでゆったりとしたスケジュールで実行され、マイクロバッチごとのレイテンシが削減されました。この改善はすべてのパイプラインとワークロードに適用されるため、すべてのStructured Streamingパイプラインでデフォルトでバックグラウンドで有効になります。当社の性能評価では、100K、500K、1M イベント/秒のスループットでレイテンシが 200~300ms 短縮されました。
Availability - この機能はDBR11.3以降のリリースから利用可能です。
詳細については、以下のブログをご参照ください。
- Apache Spark Structured Streamingでレイテンシが1秒未満になりました
マイクロバッチパイプライニング
ベンチマークのためにStructured Streamingクエリを実行すると、sparkクラスタの使用率が低く、レイテンシが高く、スループットが低いことが観察されました。さらに調査したところ、これはStructured Streamingの基本的な実行メカニズムが原因であることがわかりました:
- ストリーミングクエリで一度に実行できるマイクロバッチは1つのみ
- マイクロバッチの1つのステージだけが一度に実行できるため、ストリーミングクエリではすべてのステージが順次実行されます。
このため、現在のマイクロバッチの1つのタスクの終了に時間がかかると、次のマイクロバッチのタスクの実行のスケジューリングが遅れます。この間、すでに完了したタスクのタスクスロットは利用されないため、待ち時間が長くなり、スループットが低下します。
利用率を向上させ、待ち時間を短縮するために、前のマイクロバッチのタスクが「すべて」終了するのを待つのではなく、前のマイクロバッチのタスクが「それぞれ」終了した直後に次のマイクロバッチのタスクが開始されるように実行メカニズムを変更しました。基本的には、マイクロバッチの実行をパイプライン化するか、多数のマイクロバッチを同時に実行します。
パイプライン実行による性能向上を定量化するためにこれまでに実行したベンチマークでは、スループットとコスト削減において2~3倍の改善が見られました。 さらに多くのベンチマークを実行し、パイプライン実行による性能向上をさらに最適化する予定です。
Availability - この機能は2023年第3四半期にGAされる予定です。
ステートフル・パイプラインの性能に関する考察
予測不可能で一貫性のないパフォーマンス
既存のモデルでは、Structured StreamingパイプラインがRocksDBのステートストア・プロバイダを使用する場合、遅延が大きく変動することがありました。詳細な調査の結果、ステートストアに関連するコミットオペレーションがタスク時間の50-80%に寄与していることが判明しました。以下は、私たちが確認した問題の一部です:
- メモリの増加/使用に関する問題 - RocksDBのステートストア・プロバイダでは、すべての更新がwriteBatchWithIndexを使ってメモリに保存されていました。これは、インスタンス単位で使用量が制限されないだけでなく、単一ノードのステート・ストア・インスタンス全体でグローバルな制限がないことを意味しました。ステートフルなクエリの場合、ステート・ストア・インスタンスの数は通常パーティションの数に比例するため、大きなステートを扱うクエリではメモリ使用量が急増します。
- データベースの書き込み/フラッシュ関連の速度低下 - コミット操作の一部として、writeBatchWithIndexからデータベースへの書き込みと、同期フラッシュを実行していました。また、SST(Sorted String Table)ファイルの同期とともに、WAL(write-ahead log)へのすべての書き込みを強制していたため、更新が重複していました。また、データベースのスナップショットを取得する前に、バックグラウンドの作業が完了するまで明示的に待機していたため、バックグラウンドのコンパクション/フラッシュ処理に関連する一時停止が発生していました。
- 書き込みの増幅 - 既存のモデルでは、分散ファイルシステムにアップロードされた状態のサイズは、変更された実際の状態データのサイズに比例していませんでした。これは、RocksDBのSSTファイルがLSM(Log Structured Merge)コンパクション中にマージされるためです。そのため、以前のバージョンと比較して変更されたSSTファイルをすべて特定しようとすると、分散ファイルシステムに多くのファイルを同期する必要があり、書き込みが増幅され、ネットワークとストレージのコストが追加されることになります。
より高速で一貫性のあるパフォーマンスに向けて
上述した問題に対処するため、より高速で一貫性のあるパフォーマンスを実現するために多くの改善を行いました。