Auto Loader ディレクトリリストモードとは何ですか?

Auto Loader は、デフォルトによるディレクトリリストモードを使用します。 ディレクトリー・リスト・モードでは、 Auto Loader は入力ディレクトリーをリストすることによって新規ファイルを識別します。 ディレクトリリストモードでは、クラウドストレージ上のデータへのアクセス以外の権限設定なしで Auto Loader ストリームをすばやく開始できます。

ディレクトリ一覧モードで最適なパフォーマンスを得るには、 Databricks Runtime 9.1 以降を使用します。 この記事では、ディレクトリリストモードのデフォルト機能と、 ファイルの字句順序に基づく最適化について説明します。

ディレクトリリストモードはどのように機能しますか?

Databricks では、 Auto Loader が他の Apache Spark オプションよりも効率的にクラウド ストレージ内のファイルを検出できるように、ディレクトリ一覧モードが最適化されています。

たとえば、 /some/path/YYYY/MM/DD/HH/fileNameとして 5 分ごとにファイルをアップロードする場合、これらのディレクトリ内のすべてのファイルを検索するために、Apache Spark ファイル ソースにはすべてのサブディレクトリが並列に一覧表示されます。 次のアルゴリズムは、オブジェクト・ストレージへのAPI LIST ディレクトリ呼び出しの総数を推定します:

1 (ベース ディレクトリ) + 365 (1 日あたり) * 24 (1 時間あたり) = 8761 コール

ストレージからフラット化された応答を受信することで、 Auto Loader は API 呼び出しの数をストレージ内のファイルの数で割った値に減らし、各 API 呼び出しによって返される結果の数を減らし、クラウドのコストを大幅に削減します。 次の表は、共通オブジェクト・ストレージの各APIコールによって返されるファイルの数を示しています:

呼び出しごとに返される結果

オブジェクトストレージ

1000

S3

5000

ADLS Gen2

1024

GCS

インクリメンタルリスト(非推奨)

重要

この機能は非推奨になりました。 Databricks では、増分一覧表示ではなく ファイル通知モード を使用することをお勧めします。

Databricks Runtime 9.1 LTS 以降で利用できます。

増分リストは、Azure データレイク Storage Gen2 (abfss://)、S3 (s3://)、および GCS (gs://) で使用できます。

辞書式に生成されたファイルの場合、 Auto Loader は字句ファイルの順序付けと最適化されたリスト APIs を利用して、ディレクトリ全体の内容をリストするのではなく、最近取り込まれたファイルからリストすることで、ディレクトリリストの効率を向上させます。

デフォルトによって、 Auto Loader は、以前に完了したディレクトリリストのファイルパスをチェックして比較することにより、特定のディレクトリが増分リストに適用可能かどうかを自動的に検出します。 auto モードでのデータの最終的な完全性を保証するために、 Auto Loader は 7 つの連続した増分リストを完了すると、完全なディレクトリ リストを自動的にトリガーします。 完全なディレクトリ リストの頻度を制御するには、特定の間隔で非同期バックフィルをトリガーするように cloudFiles.backfillInterval を設定します。

ファイルの 字句順序

ファイルを字句順に並べるには、アップロードされる新しいファイルに、既存のファイルよりも辞書的に大きいプレフィックスを付ける必要があります。 字句順に並べられたディレクトリの例を以下に示します。

バージョン管理されたファイル

Delta Lake は、テーブル トランザクション ログに字句順にコミットします。

<path-to-table>/_delta_log/00000000000000000000.json
<path-to-table>/_delta_log/00000000000000000001.json <- guaranteed to be written after version 0
<path-to-table>/_delta_log/00000000000000000002.json <- guaranteed to be written after version 1
...

AWS DMS は、バージョン管理された方法で CDC ファイルを AWS S3 にアップロードします。

database_schema_name/table_name/LOAD00000001.csv
database_schema_name/table_name/LOAD00000002.csv
...

パーティション分割されたファイルの 日付

ファイルは、日付パーティション形式でアップロードできます。 この例をいくつか次に示します。

// <base-path>/yyyy/MM/dd/HH:mm:ss-randomString
<base-path>/2021/12/01/10:11:23-b1662ecd-e05e-4bb7-a125-ad81f6e859b4.json
<base-path>/2021/12/01/10:11:23-b9794cf3-3f60-4b8d-ae11-8ea320fad9d1.json
...

// <base-path>/year=yyyy/month=MM/day=dd/hour=HH/minute=mm/randomString
<base-path>/year=2021/month=12/day=04/hour=08/minute=22/442463e5-f6fe-458a-8f69-a06aa970fc69.csv
<base-path>/year=2021/month=12/day=04/hour=08/minute=22/8f00988b-46be-4112-808d-6a35aead0d44.csv <- this may be uploaded before the file above as long as processing happens less frequently than a minute

日付パーティションを使用してファイルをアップロードする場合、次の点に注意してください。

  • 月、日、時間、分は、字句の順序を確実にするためにゼロを埋めたままにする必要があります(hour=3 ではなく hour=03としてアップロードしたり、 2021/5/3の代わりに 2021/05/03 したりする必要があります)。

  • ファイルは、親ディレクトリの時間粒度よりも処理の頻度が低い限り、必ずしも最も深いディレクトリに字句順にアップロードする必要はありません。

日付でパーティション分割された字句順にファイルをアップロードできるサービスには、次のようなものがあります。

Auto Loader のソースパスを変更する

Databricks Runtime 11.3 LTS以降では、新しいチェックポイントディレクトリを選択しなくても、ディレクトリリストモードで構成された Auto Loader のディレクトリ入力パスを変更できます。

警告:

この機能は、ファイル通知モードではサポートされていません。 ファイル通知モードを使用してパスを変更すると、ディレクトリの更新時に新しいディレクトリに既に存在するファイルの取り込みに失敗する可能性があります。

たとえば、 /YYYYMMDD/など、日ごとに整理されたディレクトリ構造からすべてのデータを読み込む毎日のインジェスト ジョブを実行する場合は、同じチェックポイントを使用して、以前に使用したすべてのソース ディレクトリから取り込まれたファイルの状態情報を維持しながら、毎日異なるソース ディレクトリのインジェスト状態情報を追跡できます。