Delta Lake を使用したデータ整合性
Delta Lake のデータ整合性は、ライフサイクル全体にわたってデータの正確性、一貫性、信頼性を確保する重要な側面です。 Delta Lake には、特に複雑なデータ パイプラインと複数の同時ユーザーが含まれる環境で、データ整合性を維持するためのメカニズムがいくつか用意されています。
Delta Lake でデータ整合性を維持するために採用されている主な機能と手法は、次のとおりです。
- ACID トランザクション
- スキーマの適用
- スキーマの展開
- マージ操作
- タイム トラベル
- 同時書き込み
- ファイル管理と圧縮
- 整合性チェック
- データ整合性チェックの実装
ACID トランザクション
Delta Lake では、ACID (原子性、一貫性、分離性、持続) トランザクションがサポートされています。 つまり、Delta テーブルに対する各操作はトランザクションとして扱われ、完全に完了するか、まったく実行されないかのどちらかになるため、データの破損につながる可能性のある部分的なデータ更新が防止されます。
- 原子性: 各トランザクションが 1 つの "ユニット" として扱われ、完全に成功するか、完全に失敗することを保証します。
- 一貫性: 定義されているすべてのルールと制約に従う有効なデータのみがデータベースに書き込まれるようにします。
- 分離性: 各トランザクションを実質的に分離し、トランザクションが相互に干渉しないようにすることで、パフォーマンスと整合性を維持します。
- 持続性: トランザクションがコミットされたら、クラッシュ、停電、その他のシステム障害が発生しても、コミットされたままになることを保証します。
スキーマの適用
Delta Lake では、書き込み操作に対してスキーマの検証が適用されます。 つまり、Delta テーブルに書き込まれるデータは、テーブルのスキーマと一致している必要があります。そうでないと書き込み操作は失敗します。 これにより、データの不整合につながる可能性がある不適切なデータ型や予期しないスキーマ変更が防止されます。
スキーマの展開
また、Delta Lake では、スキーマを適用しながら、ダウンタイムなしでスキーマを進化させることができます。 つまり、データの進化に合わせて、新しい列を追加したり、スキーマのデータ型を変更したりできます。 スキーマ進化により、すべてのデータにアクセスでき、新しいスキーマ定義と一貫性が保たれます。
マージ操作
Delta Lake では、複雑な ETL (抽出、変換、読み込み) パイプラインでのアップサート (既存のレコードの更新と新しいレコードの同時挿入) に不可欠な、高度なマージ操作がサポートされています。 マージ操作はトランザクションであり、各レコードが指定された条件に従って正しく更新または挿入されるようにすることで、データ整合性を維持します。
タイム トラベル
タイム トラベルは、履歴バージョンのデータにアクセスできる機能です。 これは、監査、デバッグ、望ましくない変更のロールバックに役立ちます。これにより、最近の更新でデータが破損したり、意図せずデータが変更されたりした場合に、データ整合性を復元できます。 履歴データのクエリを実行する方法の例を次に示します。
df = spark.read.format("delta").option("versionAsOf", 3).load("/FileStore/tables/table")
同時書き込み
Delta Lake では、オプティミスティック同時実行モデルを使用して同時書き込みを処理します。 複数のトランザクションが行われる場合は、競合が発生しないようにそれらのトランザクションをシリアル化します。 競合が検出された場合、シナリオに応じて、トランザクションは Delta Lake で再試行されるか失敗します。
ファイル管理と圧縮
Delta Lake は、圧縮 (ビンパッキング) やデータ スキップなどのメカニズムによってファイル管理を最適化します。 これらの機能により、小さいファイルの数が減り、読み取りの効率が向上するため、ハイ パフォーマンスが維持され、読み取りと書き込みの間にデータの不整合が発生する可能性が低くなります。
整合性チェック
Delta Lake には、データ ストレージ レイヤーの不整合をチェックするユーティリティが用意されており、データ ファイルとそれに対応するメタデータが常に確実に同期されます。これらのチェックは、システム障害からの復旧後や分散環境において重要です。