自動ローダー ディレクトリリスト表示モードとは?

自動ローダーでは、既定でディレクトリ一覧モードが使用されます。 ディレクトリ一覧モードでは、自動ローダーは、入力ディレクトリの一覧を生成することによって、新しいファイルを識別します。 ディレクトリ一覧モードを使用すると、クラウド ストレージ上のデータへのアクセス以外のアクセス許可を構成することなく、自動ローダー ストリームをすばやく開始できます。

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

ディレクトリ一覧モードのしくみ

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

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

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

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

呼び出しごとに返される結果 オブジェクト ストレージ
1000 S3
5000 ADLS Gen2
1024 GCS

増分一覧 (非推奨)

重要

この機能は廃止されました。 Databricks では、増分一覧の代わりにファイル通知モードを使用することをお勧めします。

Note

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

増分一覧は、Azure Data Lake Storage Gen2 (abfss://)、S3 (s3://)、GCS (gs://) で利用可能です。

辞書式に生成されたファイルの場合、自動ローダーでは、ファイルの字句順序と最適化された一覧の API を活用して、ディレクトリ全体のコンテンツの一覧を生成するのではなく、最近取り込んだファイルから一覧を生成することで、ディレクトリ一覧の効率を向上させます。

既定では、自動ローダーは、以前に完了したディレクトリ一覧のファイル パスを検査して比較することで、特定のディレクトリが増分一覧に適用できるかどうかを自動的に検出します。 auto モードでデータの最終的な完全性を確保するために、自動ローダーは、増分リストを連続して 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=032021/5/3 ではなく 2021/05/03 としてアップロードする必要があります)。
  • 親ディレクトリの時間の細分性よりも低い頻度で処理が行われる限り、ファイルは必ずしも最も深いディレクトリに字句順にアップロードする必要はありません。

日付でパーティション分割された字句順でファイルをアップロードできるサービスは次のとおりです。

自動ローダーのソース パスを変更する

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

警告

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

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