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

Databricks でのアーカイブのサポート

備考

プレビュー

この機能は、Databricks Runtime 13.3 LTS 以降でパブリック プレビュー段階です。

Databricks のアーカイブ サポートでは、Delta Lake テーブルを含むクラウドオブジェクトストレージでクラウドベースのライフサイクル ポリシーを使用できます。Delta Lake テーブルでアーカイブサポートを有効にすると、Databricks はテーブル内で指定された期間より古いファイルを無視するようになります。

クラウドライフサイクル ポリシーは、古いファイルをアーカイブ ストレージ層に移動することでストレージ コストを削減します。アーカイブサポートがない場合、クエリーが読み取るデータファイルが利用できなくなるため、ライフサイクルポリシーによりDelta Lake テーブルに対するクエリーが破損する可能性があります。アーカイブサポートを有効にする必要があるのはなぜですか?を参照してください。

アーカイブサポートの使用時期​

次のすべてがtrueの場合にテーブルのアーカイブサポートを有効にします。

  • ファイルの作成時刻に基づいてテーブルのデータファイルをアーカイブするライフサイクルポリシーを使用します。
  • テーブルに対するほとんどのクエリーは、最近のデータを読み取るか、アーカイブされたファイルを除外します。
  • アーカイブされたデータを必要とするクエリーは頻繁には発生せず、クエリーを再実行する前に、クラウドプロバイダーのストレージでそれらのファイルを復元するのを待つことができます。「アーカイブされたファイルの復元」を参照してください。

クエリーが定期的にテーブルの履歴全体をスキャンする場合、アーカイブサポートは使用しないでください。アーカイブされたファイルを必要とするクエリーは失敗します。アーカイブサポートは、アクセス時間やタグに基づくライフサイクルポリシーとも連動しません。制限事項を参照してください。

要件​

アーカイブ機能を利用するには、S3 Glacier Deep ArchiveまたはGlacier Flexible Retrievalが必要です。アーカイブされたオブジェクトの操作方法については、AWS のドキュメントを参照してください。

Amazon S3 Glacier Instant Retrieval では、アーカイブサポートを設定する必要はありません。 ただし、クエリを実行すると、スキャンされたすべてのファイルが取得されます。 Databricks では、ライフサイクル ポリシーが構成された Glacier Instant Retrieval に格納されているテーブルに対するクエリを制限するために、ビューを使用することをお勧めします。

警告

Amazon S3 Intelligent-Tieringのオプションである非同期アーカイブアクセス階層は、ファイル作成時間ではなくアクセス時間に基づいてアーカイブを行うため、Databricksのアーカイブサポートとは互換性がありません。

アーカイブサポートを有効にする必要があるのはなぜですか?​

アーカイブのサポートは、アーカイブされたファイルに触れることなく正しい結果を返すクエリーのみを許可します。これらのクエリーには、以下のいずれかを行うクエリーが含まれます。

  • メタデータのみをクエリします。
  • アーカイブされたファイルのスキャンを必要としないフィルターを用意します。

アーカイブされたファイルのデータを必要とするすべてのクエリは失敗します。

重要

Databricks は、アーカイブされたファイルが正しい結果を返す必要があるクエリの結果を返すことはありません。

Databricksでテーブルのアーカイブサポートを有効にしても、クラウドオブジェクトストレージ用に定義されたライフサイクルポリシーが作成または変更されることはありません。ライフサイクル管理の移行ルールを変更するを参照してください。

アーカイブサポートがない場合、データファイルやトランザクションログファイルがアーカイブされた場所に移動され、クエリー時に利用できなくなるため、Delta Lake テーブルに対する操作が破損する可能性があります。アーカイブサポートには、可能な場合にアーカイブされたデータのクエリーを回避するための最適化が導入されています。また、クエリーを完了するためにアーカイブストレージから復元する必要があるファイルを識別するための新しい構文も追加されます。

アーカイブ・データ用に最適化されたクエリ​

Databricks のアーカイブ サポートにより、 Delta Lake テーブルに対するこれらのクエリーが最適化されます。

クエリー

新しい動作

SELECT * FROM <table_name> LIMIT <limit> [WHERE <partition_predicate>]

アーカイブされたファイルを自動的に無視し、アーカイブされていないストレージ階層のデータから結果を返します。

Delta Lake メンテナンス コマンド: OPTIMIZE、 ZORDER、 ANALYZE、 PURGE

アーカイブされたファイルを自動的に無視し、テーブルの残りの部分でメンテナンスを実行します。

REPLACE TABLE、INSERT OVERWRITE、TRUNCATE TABLE、および DROP TABLE

ターゲット・アーカイブ・データ・ファイルのトランザクション・ログ・エントリーに削除済みマークを付けます。

FSCK REPAIR TABLE

アーカイブされたファイルを無視し、ライフサイクル ポリシーに達していないファイルのみを確認します。

クエリー

新しい動作

SELECT * FROM <table_name> LIMIT <limit> [WHERE <partition_predicate>]

アーカイブされたファイルを自動的に無視し、アーカイブされていないストレージ階層のデータから結果を返します。

Delta Lake メンテナンス コマンド: OPTIMIZE、 ZORDER、 ANALYZE、 PURGE

アーカイブされたファイルを自動的に無視し、テーブルの残りの部分でメンテナンスを実行します。

REPLACE TABLE、INSERT OVERWRITE、TRUNCATE TABLE、および DROP TABLE

ターゲット・アーカイブ・データ・ファイルのトランザクション・ログ・エントリーに削除済みマークを付けます。

FSCK REPAIR TABLE

アーカイブされたファイルを無視し、ライフサイクル ポリシーに達していないファイルのみを確認します。

初期の失敗とエラーメッセージ​

正しい結果を生成するためにアーカイブされたファイルをスキャンする必要があるクエリーの場合、Delta Lakeのアーカイブサポートを設定すると、次の効果があります。

  • クエリは、アーカイブされたファイルにアクセスしようとすると早期に失敗し、無駄なコンピュートを減らし、ユーザーがクエリを迅速に適応させて再実行できるようにします。
  • エラーメッセージは、クエリがアーカイブされたファイルにアクセスしようとしたためにクエリが失敗したことをユーザーに知らせます。

ユーザーは、 SHOW ARCHIVED FILES 構文を使用して、復元する必要があるファイルのレポートを生成できます。 アーカイブされたファイルを表示するを参照してください。

重要

エラーNot enough files to satisfy LIMITが発生した場合、テーブルにはアーカイブされていないファイルにLIMITで指定されたレコード数を満たすのに十分なデータ行がありません。LIMIT句を下げて、指定されたLIMITを満たすのに十分なアーカイブされていない行を見つけます。制限事項を参照してください。

アーカイブ サポートを有効にする​

Delta Lake テーブルのアーカイブサポートは、基盤となるクラウドライフサイクル管理ポリシーで構成されたアーカイブ間隔を手動で指定して有効にします。

SQL
ALTER TABLE <table_name> SET TBLPROPERTIES(delta.timeUntilArchived = 'X days');

timeUntilArchived時間を設定すると、Databricks は指定された期間よりも古い Delta Lake テーブル内のファイルを無視します。この設定は、クラウドアカウントのライフサイクルポリシーとは別個のものです。一方の変更は他方に影響を与えません。クラウドアカウントのライフサイクルポリシーを更新する場合は、Delta Lakeテーブルのアーカイブ設定も更新する必要があります。ライフサイクル管理の移行ルールを変更するを参照してください。

新しいライフサイクルポリシーをクラウドアカウントに設定すると、ポリシーがすべてのS3システムに完全に伝播されるまでに遅延が発生する場合があります。ライフサイクル構成の設定を参照してください。

クラウドオブジェクトストレージにライフサイクルポリシーを設定せずにこの設定を有効にすると、アーカイブサポートによってクエリが成功し、結果にはアーカイブ対象としてマークされたファイルからのデータが含まれます。Databricksが復元されたデータをどのようにサンプリングするかを参照してください。

警告

クラウド ライフサイクル ポリシーでは、Delta トランザクション ログ ( _delta_log/ディレクトリ) をアーカイブしてはなりません。制限事項を参照してください。

重要

アーカイブのサポートは完全に互換性のあるDatabricksコンピュート環境に依存しており、Delta Lakeテーブルに対してのみ機能します。アーカイブサポートを設定しても、OSS Delta LakeクライアントまたはDatabricks Runtime 12.2 LTS以下の動作、互換性、またはサポートは変更されません。

アーカイブされたファイルを表示する​

特定のクエリを完了するために復元する必要のあるファイルを特定するには、 SHOW ARCHIVED FILESを使用します。

SQL
SHOW ARCHIVED FILES FOR table_name [ WHERE predicate ];

この操作は、アーカイブされたファイルのファイル名を Spark DataFrame として返します。オブジェクトストレージプロバイダーからの文書化された指示に従って、必要なアーカイブファイルを復元します。「アーカイブされたファイルの復元」を参照してください。

Databricks復元されたデータを確認する方法については、「復元されたデータのサンプリング方法」Databricksを参照してください。

注記

この操作の間、 Delta Lake はトランザクション ログに含まれるデータ統計にのみアクセスします。defaultでは、これらはテーブルの最初の32列で収集された統計です:

  • 最小値
  • 最大値
  • Null カウント
  • レコードの総数

戻されるファイルには、述部を満たすレコードがファイルに存在するかどうかを判別するために読み取る必要があるすべてのアーカイブ・ファイルが含まれます。 Databricks 、復元する必要があるファイルの数を減らすために、データがパーティション分割、 Z-ordered、またはクラスタ化されるフィールドを含む述部を提供することをお勧めします。

アーカイブされたファイルを復元する​

復元が必要なすべてのファイルを特定するには、SHOW ARCHIVED FILESを使用してアーカイブされたファイルのリストを表示します。

S3復元オブジェクトAPIsを使用して、ファイルを高速な取得ストレージ階層に復元します。アーカイブされたオブジェクトを復元するを参照してください。

クラウドプロバイダーのストレージでファイルを復元した後、テーブルをクエリできます。アーカイブサポートは、復元されたファイルを自動的に認識します。Databricksが復元されたデータをどのように確認するかの情報については、Databricksは復元されたデータをどのようにサンプリングしますか?を参照してください。

アーカイブされたデータを更新または削除する​

アーカイブされたファイル内のデータに影響を与えるMERGE、UPDATE、またはDELETEの操作を実行すると、その操作は失敗します。これらの操作を実行するには、高速な取得をサポートするストレージ階層にデータを復元する必要があります。SHOW ARCHIVED FILESを使用して、復元する必要があるファイルを決定します(アーカイブされたファイルを復元するを参照)。

Databricks は復元されたデータをどのようにサンプリングしますか?​

Databricksがアーカイブサポートが有効になっているテーブルに対してスキャンを準備する際、クエリで指定された保持期間よりも古いファイルをサンプリングして、ファイルが復元されているかどうかを判断します。結果が、アーカイブされていると想定されるサンプリングされたファイルが復元されたことを示している場合、Databricks はクエリのすべてのファイルが復元されたとみなし、クエリ処理を実行します。結果には、アーカイブ対象としてマークされたファイルからのデータが含まれています。

サンプリングはすべてのクエリに適用されるとは限りません。制限事項を参照してください。

制限​

アーカイブサポートには以下の制限があります:

  • アーカイブ サポートはデータ ファイルにのみ適用されます。Deltaトランザクション ログ ( _delta_log/ディレクトリ) 内のいずれかのファイルがアーカイブ ストレージ層に移動されると、テーブルは完全にアクセスできなくなり、テーブルに対するすべてのクエリは失敗します。 _delta_log/パスがアーカイブに含まれないように、クラウド ライフサイクル ポリシーを構成する必要があります。S3 ライフサイクル設定の例を参照してください。
  • ファイルの作成時間に基づかないライフサイクル管理ポリシーはサポートされていません。 これには、アクセス時間ベースのポリシーとタグベースのポリシーが含まれます。
  • アーカイブされたファイルがあるテーブルで DROP COLUMN を使用することはできません。
  • REORG TABLE APPLY PURGE はベストエフォートを試みますが、アーカイブされていない削除ベクトル ファイルと参照データ ファイルに対してのみ機能します。 アーカイブされた削除ベクトル ファイルは削除PURGE。
  • ライフサイクル管理移行ルールを拡張すると、予期しない動作が発生します。 ライフサイクル管理移行ルールの拡張を参照してください。
  • LIMIT アーカイブサポートが有効になっているテーブルに対するクエリでは、復元されたデータのサンプリングはトリガーされません。テーブルのデータが復元された場合、復元されたデータに対するクエリのほとんどは成功しますが、 LIMITクエリはDELTA_ARCHIVED_FILES_IN_LIMITエラーを返します。Databricksが復元されたデータをどのようにサンプリングするかを参照してください。

ライフサイクル管理の移行ルールを変更する​

クラウドライフサイクル管理の遷移ルールの時間間隔を変更する場合は、プロパティdelta.timeUntilArchived同じ間隔に更新する必要があります。

アーカイブまでの時間間隔が短縮された場合(ファイル作成からの経過時間が短い)、テーブルプロパティが更新された後、Delta Lakeテーブルのアーカイブサポートは通常どおり機能し続けます。

ライフサイクル管理移行ルールの拡張​

アーカイブ前の時間間隔が延長された場合 (アーカイブがトリガーされるまでの時間を追加するため)、プロパティ delta.timeUntilArchived を新しい値に更新すると、エラーが発生する可能性があります。 クラウドプロバイダーは、データ保持ポリシーが変更されても、アーカイブされたストレージからファイルを自動的に復元しません。 つまり、以前はアーカイブの対象となっていたが、現在はアーカイブの対象とは見なされていないファイルは、引き続きアーカイブされます。

重要

エラーを回避するには、プロパティ delta.timeUntilArchived を、最後にアーカイブされたデータの実際の経過時間より大きい値に設定しないでください。

アーカイブの時間間隔が 60 日から 90 日に変更されるシナリオを考えてみます。

  1. 60 日から 90 日経過したすべてのレコードは、ポリシーが変更されたときにアーカイブされます。
  2. 30 日間は、新しいファイルはアーカイブされません (ポリシーが延長されたとき、アーカイブされていない最も古いファイルは 60 日前です)。
  3. 30 日後、ライフサイクル ポリシーでは、アーカイブされたすべてのデータが正しく記述されます。

delta.timeUntilArchived設定は、Deltaトランザクションログに記録されているファイル作成時間に対して、設定された時間間隔を追跡します。基礎となるポリシーに関する明示的な知識はありません。古いアーカイブ threshold と新しいアーカイブ threshold の間の遅延期間中は、アーカイブされたファイルのクエリーを避けるために、次のいずれかのアプローチをとることができます。

  1. すべてのファイルをアーカイブするのに十分な時間が経過するまで、設定 delta.timeUntilArchived を古いしきい値のままにしておくことができます。

    • 上記の例に従えば、最初の 30 日間は毎日、別の 1 日分のデータが Databricks によってアーカイブされたと見なされますが、それでもクラウドプロバイダーがアーカイブする必要があります。これによりエラーは発生しませんが、クエリされる可能性のある一部のデータ・ファイルが無視されます。
    • 30 日後、 delta.timeUntilArchived を 90 daysに更新します。
  2. ラグ期間中の現在の間隔を反映するために、設定を毎日更新 delta.timeUntilArchived ことができます。

    • クラウド ポリシーが 90 日に設定されている間、アーカイブされたデータの実際の経過時間はリアルタイムで変化します。 たとえば、7 日後に delta.timeUntilArchived を 67 days に設定すると、アーカイブされたすべてのデータ ファイルの経過時間が正確に反映されます。
    • このアプローチは、ホットティア内のすべてのデータにアクセスする必要がある場合にのみ必要です。
注記

delta.timeUntilArchived の値を更新しても、アーカイブされるデータは変更されません。Databricks がアーカイブされたかのように扱うデータのみが変更されます。