メインコンテンツまでスキップ

Databricks の ACID 保証とは何ですか?

Databricksはすべての読み取りと書き込みにデフォルトでDelta Lakeを使用しており、オープンソースのDelta Lakeプロトコルが提供するACID保証に基づいて構築されています。ACIDは、原子性、一貫性、独立性、耐久性の略です。

  • 原子性とは、すべてのトランザクションが成功するか、完全に失敗することを意味します。
  • 一貫性 の保証は、データの特定の状態が同時操作によってどのように観察されるかに関連します。
  • 分離とは、同時操作が互いに競合する可能性があることを指します。
  • 持続性とは、コミットされた変更が永続的であることを意味します。

多くのデータ処理およびウェアハウス テクノロジでは、 ACIDトランザクションの使用について説明していますが、具体的な保証はシステムによって異なり、 Databricks でのトランザクションは、作業した他のシステムと異なる場合があります。

注記

このページでは、Delta Lakeによってバックアップされたテーブルの保証について説明します。他のデータ形式や統合システムでは、読み取りと書き込みのトランザクション保証が提供されない可能性があります。

Databricksによるクラウドオブジェクトストレージへの書き込みのすべてにトランザクションコミットが使われ、 _started_<id>_committed_<id> で始まるメタデータファイルがデータファイルと併せて作成されます。Databricksは定期的に古いコミットメタデータファイルをクリーンアップするため、これらのファイルを操作する必要はありません。

Databricks ではトランザクションのスコープはどのように設定されますか?

デフォルトでは、各 SQL ステートメントは 1 つのテーブルに対して独自のアトミック トランザクションとして実行されます。また、 BEGIN ATOMIC ... END;構文を使用して、複数のテーブルにわたる複数のステートメントを単一のアトミック トランザクションにグループ化することもできます。すべての変更は同時に成功するか、同時にロールバックされます。複数のテーブルにまたがるトランザクションでは、参加するテーブルでカタログ管理コミットを有効にする必要があります。トランザクションを参照してください。

並列トランザクションの管理には、Databricksは最適同時並列制御を使用します。これは、テーブルに対する読み取りまたは書き込みにロックがなく、デッドロックが発生する可能性がないことを意味します。

デフォルトでは、Databricks は読み取り時にスナップショット分離を提供し、書き込み時に書き込みシリアル化可能な分離を提供します。書き込みシリアル化可能な分離はスナップショット分離よりも強力な保証を提供しますが、これらの保護は書き込み操作にのみ適用されます。

複数のテーブルを参照する読み取り操作は、アクセス時の各テーブルの現在のバージョンを返しますが、参照されるテーブルを変更する可能性のある並列トランザクションは中断されません。

Databricksはどのように原子性を実装していますか?

トランザクションログはコミットの原子性を制御します。トランザクション中、データファイルはテーブルをバックアップするファイルディレクトリに書き込まれます。トランザクションが完了すると、トランザクション中に書き込まれたすべてのファイルへのパスを含む新しいエントリがトランザクションログにコミットされます。コミットが行われるたびにテーブルのバージョンが増分され、新しいデータファイルが読み取り操作で可視化されます。テーブルの現在の状態は、トランザクションログで有効とマークされたすべてのデータファイルにより構成されます。

トランザクションログに新しいバージョンが記録されない限り、データファイルは追跡されません。テーブルにデータファイルを書き込んだ後にトランザクションが失敗した場合、これらのデータファイルはテーブルの状態を破壊しないものの、ファイルがテーブルの一部になることはありません。VACUUM 操作は、失敗したトランザクション内に残るコミット未処理のファイルを含め、テーブル・ディレクトリ内で追跡されていないデータファイルをすべて削除します。

Databricks は耐久性をどのように実装していますか?

Databricks は、クラウドオブジェクトストレージを使用して、すべてのデータファイルとトランザクションログを格納します。クラウドオブジェクトストレージは、高可用性と耐久性を備えています。トランザクションは成功するか完全に失敗するかのどちらかであり、トランザクションログはクラウドオブジェクトストレージ内のデータファイルと共に存在するため、Databricks 上のテーブルは、それらが保存されているクラウドオブジェクトストレージの耐久性保証を継承します。

Databricks はどのように一貫性を実装していますか?

Delta Lake は最適同時並列制御を使用して、書き込み間のトランザクション保証を提供します。このメカニズムにおける書き込み動作には、以下の3つの段階が含まれます。

  1. 読み込み :(必要に応じて)テーブルの利用可能な最新バージョンを読み取り、どのファイルを変更する(書き換える)必要があるかを特定します。

    • 追加専用の書き込みでは、書き込み前に現在のテーブルの状態が読み取られることはありません。スキーマ検証では、トランザクションログのメタデータが使用されます。
  2. 書き込み :テーブルの定義に使用されたディレクトリにデータファイルを書き込みます。

  3. 検証とコミット

    • スナップショットの読み取り以降に並列してコミットされた可能性のある他の変更と提案された変更が競合するかどうかを検証します。
    • 競合がない場合、段階的な変更はすべて新しいバージョンのスナップショットとしてコミットされ、書き込み操作は成功します。
    • 競合がある場合、書き込み操作は失敗し、並列変更の例外となります。この失敗は、データの破損を防ぎます。

楽観的同時実行性では、データ上のほとんどの並列トランザクションは互いに競合しないものと想定されますが、競合が発生する可能性はあります。 分離レベルと書き込み競合を参照してください。

Databricks はどのように分離を実装していますか?

Databricksでは、すべてのテーブルにおける書き込みと更新に対して、書き込みの直列化可能な分離がデフォルトで使用されます。スナップショットの分離は、すべてのテーブル読み取りに使用されます。

書き込みの直列化可能性と最適同時並列制御の連携により、書き込みの高スループットを実現します。テーブルの現在の有効な状態は常に利用可能であり、いつでもテーブルに対する書き込みを開始できます。同時並列読み取りは、メタストアとクラウドリソースのスループットによってのみ制限されます。

分離レベルと書き込み競合を参照してください。

Delta Lake はマルチテーブルトランザクションをサポートしていますか?

備考

プレビュー

Unity Catalog で管理される Delta テーブルに書き込むトランザクションは、パブリック プレビュー段階にあります。

Unity Catalog で管理される Iceberg テーブルに書き込むトランザクションは、プライベート プレビュー段階です。このプレビューに参加するには、マネージド Iceberg テーブル プレビュー登録フォームを送信してください。

はい。カタログ管理コミットが有効になっているテーブルは、複数のステートメントと複数のテーブルにまたがるトランザクションに参加できます。トランザクションを参照してください。

Delta Lake がマルチクラスター書き込みをサポートしているとはどういう意味ですか?

Delta Lake は、複数のクラスターが同じテーブルに同時に書き込むときにデータの破損を防ぎます。一部の書き込み操作は同時実行中に競合する可能性がありますが、テーブルが破損することはありません。分離レベルと書き込み競合を参照してください。

注記

S3 上の Delta Lake には、他のストレージ システムにはないいくつかの制限があります。 「 S3 での Delta Lake の制限事項」を参照してください。

異なるワークスペースから Delta テーブルを変更できますか?

はい、異なるワークスペースから同じ Delta テーブルを同時に変更できます。 さらに、1 つのプロセスがワークスペースから書き込んでいる場合、他のワークスペースの読者には一貫したビューが表示されます。