Databricks の ACID 保証とは何ですか?
Databricksはすべての読み取りと書き込みにデフォルトでDelta Lakeを使用しており、オープンソースのDelta Lakeプロトコルが提供するACID保証に基づいて構築されています。ACIDは、原子性、一貫性、独立性、耐久性の略です。
- 原子性とは 、すべてのトランザクションが成功するか、完全に失敗することを意味します。
- 一貫性 の保証は、データの特定の状態が同時操作によってどのように観察されるかに関連します。
- 分離とは 、同時操作が互いに競合する可能性があることを指します。
- 持続性とは 、コミットされた変更が永続的であることを意味します。
多くのデータ処理およびウェアハウス技術ではACIDトランザクションの使用について説明していますが、具体的な保証はシステムによって異なり、Databricks でのトランザクションは、これまで使用している他のシステムとは異なる場合があります。
このページでは、Delta Lakeによってバックアップされたテーブルの保証について説明します。他のデータ形式や統合システムでは、読み取りと書き込みのトランザクション保証が提供されない可能性があります。
Databricksによるクラウドオブジェクトストレージへの書き込みのすべてにトランザクションコミットが使われ、 _started_<id>
と _committed_<id>
で始まるメタデータファイルがデータファイルと併せて作成されます。Databricksは定期的に古いコミットメタデータファイルをクリーンアップするため、これらのファイルを操作する必要はありません。
Databricks ではトランザクションのスコープはどのように設定されますか?
Databricksは、テーブルレベルでトランザクションを管理します。トランザクションのテーブルへの適用は必ず1つずつ行われます。並列トランザクションの管理には、Databricksは最適同時並列制御を使用します。これは、テーブルに対する読み取りまたは書き込みにロックがなく、デッドロックが発生する可能性がないことを意味します。
デフォルトでは、Databricks は読み取り時にスナップショット分離を提供し、書き込み時に 書き込みシリアル化可能な分離 を提供します。 書き込み直列化可能分離は、スナップショット分離よりも強力な保証を提供しますが、その強力な分離は書き込みにのみ適用されます。
複数のテーブルを参照する読み取り操作は、アクセス時の各テーブルの現在のバージョンを返しますが、参照されるテーブルを変更する可能性のある並列トランザクションは中断されません。
Databricksには、複数の操作を1つのトランザクションとしてグループ化できる BEGIN/END
コンストラクタはありません。複数のテーブルを変更するアプリケーションでは、トランザクションは各テーブルに順次コミットされます。MERGE INTO
を使用して、テーブルに対する挿入、更新、および削除 1つの書き込みトランザクションに結合できます。
Databricksはどのように原子性を実装していますか?
トランザクションログはコミットの原子性を制御します。トランザクション中、データファイルはテーブルをバックアップするファイルディレクトリに書き込まれます。トランザクションが完了すると、トランザクション中に書き込まれたすべてのファイルへのパスを含む新しいエントリがトランザクションログにコミットされます。コミットが行われるたびにテーブルのバージョンが増分され、新しいデータファイルが読み取り操作で可視化されます。テーブルの現在の状態は、トランザクションログで有効とマークされたすべてのデータファイルにより構成されます。
トランザクションログに新しいバージョンが記録されない限り、データファイルは追跡されません。テーブルにデータファイルを書き込んだ後にトランザクションが失敗した場合、これらのデータファイルはテーブルの状態を破壊しないものの、ファイルがテーブルの一部になることはありません。VACUUM
操作は、失敗したトランザクション内に残るコミット未処理のファイルを含め、テーブル・ディレクトリ内で追跡されていないデータファイルをすべて削除します。
Databricks は耐久性をどのように実装していますか?
Databricks は、クラウドオブジェクトストレージを使用して、すべてのデータファイルとトランザクションログを保存します。 クラウドオブジェクトストレージは、高い可用性と耐久性を備えています。 トランザクションは成功するか完全に失敗するかのいずれかです。また、トランザクションログはクラウドオブジェクトストレージ内のデータファイルとともに保存されるため、Databricks上のテーブルは、テーブルが格納されているクラウドオブジェクトストレージの耐久性保証を継承します。
Databricks はどのように一貫性を実装していますか?
Delta Lake は最適同時並列制御を使用して、書き込み間のトランザクション保証を提供します。このメカニズムにおける書き込み動作には、以下の3つの段階が含まれます。
-
読み込み :(必要に応じて)テーブルの利用可能な最新バージョンを読み取り、どのファイルを変更する(書き換える)必要があるかを特定します。
- 追加専用の書き込みでは、書き込み前に現在のテーブルの状態が読み取られることはありません。スキーマ検証では、トランザクションログのメタデータが使用されます。
-
書き込み :テーブルの定義に使用されたディレクトリにデータファイルを書き込みます。
-
検証とコミット :
- スナップショットの読み取り以降に並列してコミットされた可能性のある他の変更と提案された変更が競合するかどうかを検証します。
- 競合がない場合、段階的な変更はすべて新しいバージョンのスナップショットとしてコミットされ、書き込み操作は成功します。
- 競合がある場合、書き込み操作は失敗し、並列変更の例外となります。この失敗は、データの破損を防ぎます。
オプティミスティック同時一致では、データ上のほとんどの並列トランザクションが互いに競合することはないが、競合が発生する可能性があると想定しています。 「Databricks での分離レベルと書き込みの競合」を参照してください。
Databricks はどのように分離を実装していますか?
Databricksでは、すべてのテーブルにおける書き込みと更新に対して、書き込みの直列化可能な分離がデフォルトで使用されます。スナップショットの分離は、すべてのテーブル読み取りに使用されます。
書き込みの直列化可能性と最適同時並列制御の連携により、書き込みの高スループットを実現します。テーブルの現在の有効な状態は常に利用可能であり、いつでもテーブルに対する書き込みを開始できます。同時並列読み取りは、メタストアとクラウドリソースのスループットによってのみ制限されます。
「Databricks での分離レベルと書き込みの競合」を参照してください。
Delta Lake はマルチテーブル トランザクションをサポートしていますか?
Delta Lakeは複数のテーブルを含むトランザクションをサポートしていません。 単一のテーブル レベルでのトランザクションをサポートします。
Delta Lake がマルチクラスター書き込みをサポートしているとはどういう意味ですか?
Delta Lake 、複数のクラスターが同じテーブルに同時に書き込む場合のデータ破損を防ぎます。 一部の書き込み操作は同時実行中に競合する可能性がありますが、テーブルは破損しません。 「Databricks での分離レベルと書き込みの競合」を参照してください。
S3 上の Delta Lake には、他のストレージ システムにはないいくつかの制限があります。 「 S3 での Delta Lake の制限事項」を参照してください。
異なるワークスペースから Delta テーブルを変更できますか?
はい、異なるワークスペースから同じ Delta テーブルを同時に変更できます。 さらに、1 つのプロセスがワークスペースから書き込んでいる場合、他のワークスペースの読者には一貫したビューが表示されます。