Unity Catalog ボリュームとは

ボリュームは、非表形式のデータセットの管理を可能にするUnity Catalogオブジェクトです。 ボリュームは、クラウド オブジェクト ストレージの場所にあるストレージの論理ボリュームを表します。 ボリュームは、ファイルへのアクセス、保存、管理、および整理のための機能を提供します。

テーブルは表形式のデータセットに対するガバナンスを提供しますが、ボリュームは非表形式のデータセットに対するガバナンスを追加します。 ボリュームを使用して、構造化データ、半構造化データ、非構造化データなど、任意の形式のファイルを格納し、アクセスすることができます。

Databricks では、すべての非表形式データへのアクセスを管理するためにボリュームを使用することを推奨しています。 テーブルと同様に、ボリュームは管理対象または外部にすることができます。

重要

ボリュームをテーブルの場所として使用することはできません。 ボリュームは、パス・ベースのデータ・アクセスのみを目的としています。 Unity Catalog で表形式のデータを操作する場合は、テーブルを使用します。

ボリュームの操作に関する詳細情報については、次の記事を参照してください。

注:

SQLボリュームを操作する場合は、カタログ エクスプローラーなどのDatabricks Runtime LTSDatabricksUI を使用していない限り、 13.3 以上を実行している ウェアハウスまたはクラスターを使用する必要があります。

管理ボリュームとは

マネージド ボリュームは、含まれているスキーマの管理されたストレージの場所内に作成される Unity Catalog によって管理されるストレージ ボリュームです。「Unity Catalog で管理対象ストレージの場所を指定する」を参照してください。

管理対象ボリュームを使用すると、外部ロケーションやストレージ資格情報のオーバーヘッドなしに、ファイルを操作するための管理対象ストレージを作成できます。 管理対象ボリュームの作成時に場所を指定する必要はなく、管理対象ボリューム内のデータに対するすべてのファイルアクセスは、Unity Catalog によって管理されるパスを介して行われます。

外部ボリュームとは

外部ボリュームは、 Unity カタログ管理のストレージ資格情報を使用して外部ロケーション内のディレクトリに対して登録された、Unity カタログ管理のストレージ ボリュームです。

Unity Catalog は、外部ボリューム内のファイルのライフサイクルとレイアウトを管理しません。 外部ボリュームを削除しても、Unity Catalog は基になるデータを削除しません。

ボリューム内のファイルへのアクセスに使用されるパスは何か

ボリュームは、 Unity Catalogの 3 レベルの名前空間 (catalog.schema.volume) の 3 番目のレベルにあります。

ボリュームに重点を置いたUnity Catalogオブジェクト モデル図

ボリュームにアクセスするためのパスは、Apache Spark、SQL、Python、その他の言語やライブラリを使用する場合でも同じです。 これは、Databricks ワークスペースにバインドされたオブジェクト ストレージ内のファイルに対する従来のアクセス パターンとは異なります。

ボリューム内のファイルにアクセスするためのパスは、次の形式を使用します。

/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>

Databricks は、Apache Spark を使用する場合にオプションのdbfs:/スキームもサポートしているため、次のパスも機能します。

dbfs:/Volumes/<catalog>/<schema>/<volume>/<path>/<file-name>

パス内のシーケンス/<catalog>/<schema>/<volume>は、ファイルに関連付けられた 3 つの Unity Catalog オブジェクト名に対応します。 これらのパス要素は読み取り専用であり、ユーザーが直接書き込むことができないため、ファイルシステム操作を使用してこれらのディレクトリを作成または削除することはできません。 これらは自動的に管理され、対応するUnity Catalogエンティティと同期されます。

注:

クラウド ストレージ URI を使用して外部ボリューム内のデータにアクセスすることもできます。

ノートブックの例: ボリュームの作成と操作

次のノートブックは、Unity Catalog ボリュームを作成して操作するための基本的な SQL 構文を示しています。

チュートリアル: Unity Catalogボリューム

ノートブックを新しいタブで開く

ボリュームの予約済みパス

ボリュームでは、ボリュームへのアクセスに使用される次の予約済みパスが導入されています。

  • dbfs:/Volumes

  • /Volumes

注:

パスは、 Apache Spark APIsおよび dbutils からのこれらのパスの潜在的な入力ミスのために予約されており、dbfs:/ が先行するかどうかに関係なく、/volumes/Volume/volume が含まれます。 パス /dbfs/Volumes も予約されていますが、ボリュームへのアクセスには使用できません。

ボリュームは、Databricks Runtime 13.3 LTS 以降でのみサポートされます。 Databricks Runtime 12.2 LTS以前では、/Volumes パスに対する操作は成功する可能性がありますが、期待どおりにUnity Catalogボリュームにデータを保存するのではなく、コンピュート クラスターに接続された一時ストレージ ディスクにデータを書き込むことができます。

重要

DBFSルートの予約済みパスに既存のデータが保存されている場合は、サポート チケットを提出してこのデータに一時的にアクセスし、別の場所に移動することができます。

制限事項

Unity Catalogボリュームと対話するには、 Unity Catalog対応のコンピュートを使用する必要があります。 ボリュームは、すべてのワークロードをサポートしているわけではありません。

注:

ボリュームは、エグゼキューターに配布されたdbutils.fsコマンドをサポートしていません。

次の制限が適用されます:

Databricks Runtime 14.3 LTS 以降の場合:

  • シングルユーザーのユーザー クラスターでは、Scala のスレッドおよびサブプロセスからボリュームにアクセスすることはできません。

Databricks Runtime 14.2 以下の場合:

  • 共有アクセス モードで構成されたコンピュートでは、UDF を使用してボリュームにアクセスすることはできません。

    • Python と Scala はどちらもドライバーから FUSE にアクセスできますが、エグゼキューターからはアクセスできません。

    • I/O 操作を実行する Scala コードはドライバー上では実行できますが、エグゼキューター上では実行できません。

  • シングルユーザーアクセスモードで構成されたコンピュートでは、 Scalaの FUSE、ボリュームパスを使用してデータにアクセスするScala IO コード、またはScala UDF はサポートされません。 Python UDF はシングル ユーザー アクセス モードでサポートされます。

サポートされているすべての Databricks Runtime バージョン:

  • Unity Catalog UDF はボリューム ファイル パスへのアクセスをサポートしていません。

  • RDD からボリュームにアクセスすることはできません。

  • spark-submit は、ボリュームに格納されている JAR では使用できません。

  • ホイールまたは JAR ファイル内のボリューム パスを介してアクセスされる他のライブラリへの依存関係を定義することはできません。

  • /Volumes/<catalog-name>または/Volumes/<catalog-name>/<schema-name>パターンを使用して Unity Catalog オブジェクトを一覧表示することはできません。 ボリューム名を含む完全修飾パスを使用する必要があります。

  • REST API の DBFS エンドポイントはボリューム パスをサポートしていません。

  • ボリュームは、Databricks ワークスペースのグローバル検索結果から除外されます。

  • クラスター ログ配信の宛先としてボリュームを指定することはできません。

  • %sh mv は、ボリューム間でのファイルの移動ではサポートされていません。 代わりに dbutils.fs.mv または %sh cp を使用してください。

  • ボリュームを使用してカスタム Hadoop ファイル システムを作成することはできません。つまり、以下はサポートされていません。

    import org.apache.hadoop.fs.Path
    val path =  new Path("dbfs:/Volumes/main/default/test-volume/file.txt")
    val fs = path.getFileSystem(sc.hadoopConfiguration)
    fs.listStatus(path)