Databricks でのバッチデータ処理とストリーミングデータ処理
この記事では、データエンジニアリング ワークロードに使用される 2 つの異なるデータ処理セマンティクス (インジェスト、変換、リアルタイム処理など) であるバッチとストリーミングの主な違いについて説明します。
ストリーミングは、一般に、Apache Kafka などのメッセージバスからの低レイテンシで継続的な処理に関連付けられています。
ただし、Databricks では、より広範な定義があります。DLT の基盤となるエンジン (Apache Spark と 構造化ストリーミング) は、バッチ処理とストリーミング処理のための統一アーキテクチャを備えています。
- エンジンは、 クラウド オブジェクト ストレージ や Delta Lake などのソースをストリーミング ソースとして扱い、効率的な増分処理を行うことができます。
- ストリーミング処理は、トリガー方式と連続式の両方で実行できるため、ストリーミングワークロードのコストとパフォーマンスのトレードオフを柔軟に制御できます。
バッチとストリーミングを区別する基本的なセマンティックの違い (長所と短所、ワークロードに対して選択するための考慮事項など) を次に示します。
バッチセマンティクス
バッチ処理では、エンジンはソースですでに処理されているデータを追跡しません。ソースで現在使用可能なすべてのデータは、処理時に処理されます。実際には、バッチ データソースは通常、データの再処理を制限するために、日や地域など、論理的に分割されます。
たとえば、電子商取引会社によって実行される販売イベントについて、時間単位で集計された平均品目販売価格の計算をバッチ処理としてスケジュールし、時間ごとの平均販売価格を計算できます。 バッチを使用すると、前の時間のデータが毎時間再処理され、以前に計算された結果が上書きされて最新の結果が反映されます。
ストリーミング セマンティクス
ストリーミング処理では、エンジンは処理されているデータを追跡し、後続の実行で新しいデータのみを処理します。上記の例では、バッチ処理の代わりにストリーミング処理をスケジュールして、1時間ごとの平均販売価格を計算できます。ストリーミングでは、前回の実行以降にソースに追加された新しいデータのみが処理されます。完全な結果を確認するには、新しく計算された結果を以前に計算された結果に追加する必要があります。
バッチとストリーミング
上記の例では、ストリーミングは、以前の実行で処理されたのと同じデータを処理しないため、バッチ処理よりも優れています。ただし、ストリーミング処理は、ソース内の順不同や遅延到着などのシナリオでより複雑になります。
到着遅延データの例としては、最初の 1 時間の売上データの一部が 2 時間目までソースに到着しない場合が挙げられます。
- バッチ処理では、最初の 1 時間の遅延到着データは、2 時間目のデータと最初の 1 時間の既存のデータで処理されます。最初の1時間の以前の結果は上書きされ、到着が遅れたデータで修正されます。
- ストリーミング処理では、最初の 1 時間から遅れて到着したデータは、処理された他の最初の 1 時間のデータなしで処理されます。処理ロジックは、前の結果を正しく更新するために、最初の 1 時間の平均計算の合計とカウントの情報を格納する必要があります。
これらのストリーミングの複雑さは、通常、 結合、 集計、 重複排除などの処理がステートフルである場合に導入されます。
ソースからの新しいデータの追加など、ステートレスなストリーミング処理の場合、データがソースに到着するときに遅延到着データを以前の結果に追加できるため、順不同および遅延到着データの処理はそれほど複雑ではありません。
次の表は、バッチ処理とストリーミング処理の長所と短所、およびこれら 2 つの処理セマンティクスをサポートするさまざまな製品機能の概要を示しています Databricks LakeFlow。
バッチ | ストリーミング | |
---|---|---|
長所 |
|
|
短所 |
|
|
データエンジニアリング製品 |
|
|
推奨 事項
次の表は、 メダリオンアーキテクチャの各レイヤーでのデータ処理ワークロードの特性に基づいて推奨される処理セマンティクスの概要を示しています。
メダリオンレイヤー | ワークロードの特性 | 推奨事項 |
---|---|---|
ブロンズ |
|
|
シルバー |
|
|
ゴールド |
|
|