ボリュームの作成と操作

この記事では、表形式以外のデータセットに対するガバナンスを可能にする Unity Catalog オブジェクトであるボリュームについて説明します。 また、ボリュームの作成、管理、および操作方法についても説明します。

ボリューム内のファイルのアップロードと管理の詳細については、 「Unity Catalog ボリュームへのファイルのアップロード」および 「Unity Catalog ボリュームのファイル管理操作」を参照してください。

注:

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

Unity Catalog ボリュームとは

ボリュームは、クラウド オブジェクト ストレージの場所にあるストレージの論理ボリュームを表す Unity Catalog オブジェクトです。 ボリュームは、ファイルへのアクセス、保存、管理、および整理のための機能を提供します。 テーブルは表形式のデータセットに対するガバナンスを提供しますが、ボリュームは非表形式のデータセットに対するガバナンスを追加します。 ボリュームを使用して、構造化データ、半構造化データ、非構造化データなど、任意の形式のファイルを格納し、アクセスすることができます。

重要

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

管理ボリュームとは

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

管理対象ボリュームを削除すると、このボリュームに保存されているファイルも 30 日以内にクラウド テナントから削除されます。

外部ボリュームとは何ですか?

外部ボリューム は、Unity カタログで管理されるストレージ認証情報を使用して、外部ロケーション内のディレクトリに対して登録された Unity カタログ管理ストレージボリュームです。外部ボリュームを使用すると、Unity Catalog データガバナンスを既存のクラウドオブジェクトストレージディレクトリに追加できます。 外部ボリュームの使用例には、次のようなものがあります。

  • 移行せずにデータ ファイルにガバナンスを追加する。

  • Databricks によって取り込まれるか、またはアクセスする必要がある他のシステムによって生成されたファイルを管理します。

  • Databricksによって生成され、他のシステムからクラウド・オブジェクト・ストレージから直接アクセスする必要があるデータを管理します。

外部ボリュームは、Unity Catalog ストレージの資格情報によって管理される外部ロケーション内のディレクトリ である必要があります 。 Unity Catalog では、外部ボリューム内のファイルのライフサイクルやレイアウトは管理されません。 外部ボリュームを削除しても、Unity Catalog は基になるデータを削除しません。

注:

ボリュームを定義すると、ボリューム パスの下のデータへのクラウド URI アクセスは、ボリュームの権限によって管理されます。

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

ボリュームにアクセスするためのパスは、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 オブジェクト名に対応します。 これらのパス要素は読み取り専用であり、ユーザーが直接書き込むことはできないため、ファイルシステム操作を使用してこれらのディレクトリを作成または削除することはできません。 これらは自動的に管理され、対応するUCエンティティと同期されます。

注:

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

ボリュームの特権は何ですか?

ボリュームはテーブルと同じ基本権限モデルを使用しますが、テーブルの権限がテーブル内の行のクエリと操作へのアクセスの付与に重点を置くのに対し、ボリュームの権限はファイルの操作に重点が置かれます。 そのため、ボリュームには次の権限が導入されています。

Unity Catalog権限とセキュリティ保護可能なオブジェクト」を参照してください。

ボリューム権限を管理できるのは誰ですか?

ボリューム権限を管理したり、ボリュームを削除したりするには、ボリュームに対する所有者権限が必要です。 Unity Catalog 内の各オブジェクトには、所有者として割り当てられるプリンシパルは 1 つだけであり、所有権はカスケードされませんが (つまり、カタログの所有者が自動的にそのカタログ内のすべてのオブジェクトの所有者になるわけではありません)、所有権に関連付けられている特権は、オブジェクト内に含まれるすべてのオブジェクトに適用されます。

つまり、Unity Catalog ボリュームの場合、次のプリンシパルがボリューム特権を管理できます。

  • 親カタログの所有者。

  • 親スキーマの所有者。

  • ボリュームの所有者。

各オブジェクトの所有者は 1 人しか持てませんが、Databricks では、ほとんどのオブジェクトの所有権を個々のユーザーではなくグループに割り当てることをお勧めします。 オブジェクトの初期所有権は、そのオブジェクトを作成したユーザーに割り当てられます。 「 Unity Catalog オブジェクトの所有権を管理する」を参照してください。

管理対象ボリュームの作成

管理対象ボリュームを作成するには、次のアクセス許可が必要です。

リソース

必要な権限

スキーマ

USE SCHEMA, CREATE VOLUME

カタログ

USE CATALOG

管理対象ボリュームを作成するには、次の構文を使用します。

CREATE VOLUME <catalog>.<schema>.<volume-name>;

「カタログエクスプローラ」(Catalog Explorer) で管理ボリュームを作成するには:

  1. Databricks ワークスペースで、カタログ アイコン [カタログ] をクリックします 。

  2. ボリュームを追加するスキーマを検索または参照し、選択します。

  3. ボリュームの作成 」ボタンをクリックします。 (十分な権限が必要です。

  4. ボリュームの名前を入力します。

  5. コメントを入力します(オプション)。

  6. 作成」をクリックします。

外部ボリュームの作成

外部ボリュームを作成するには、次の権限が必要です。

リソース

必要な権限

外部ロケーション

CREATE EXTERNAL VOLUME

スキーマ

USE SCHEMA, CREATE VOLUME

カタログ

USE CATALOG

外部ボリュームを作成するには、次の構文を使用して外部ロケーション内のパスを指定します。

CREATE EXTERNAL VOLUME <catalog>.<schema>.<external-volume-name>
LOCATION 'gcs://<external-location-bucket-path>/<directory>';

「カタログエクスプローラ」(Catalog Explorer) で外部ボリュームを作成するには

  1. Databricks ワークスペースで、カタログ アイコン [カタログ] をクリックします 。

  2. ボリュームを追加するスキーマを検索または参照し、選択します。

  3. ボリュームの作成 」ボタンをクリックします。 (十分な権限が必要です。

  4. ボリュームの名前を入力します。

  5. ボリュームを作成する外部ロケーションを選択します。

  6. パスを編集して、ボリュームを作成するサブディレクトリを反映します。

  7. コメントを入力します(オプション)。

  8. 作成」をクリックします。

ボリュームの削除

所有者権限を持つユーザーのみがボリュームを削除できます。 「ボリューム権限を管理できるユーザー"」を参照してください。

ボリュームを削除するには、次の構文を使用します。

DROP VOLUME IF EXISTS <volume-name>;

マネージド ボリュームを削除すると、Databricks は基になるデータを 30 日以内に削除します。 外部ボリュームを削除すると、Unity Catalog からボリュームが削除されますが、基になるデータは外部ロケーションで変更されません。

ボリューム内のファイルを読み取る

ボリュームの内容を表示したり、ボリュームに格納されているファイルにアクセスしたりするには、次のアクセス許可が必要です。

リソース

必要な権限

容積

READ

スキーマ

USE SCHEMA

カタログ

USE CATALOG

ボリュームの内容は、パスを使用して操作します。 「ボリューム内のファイルへのアクセスに使用されるパス」を参照してください。

ボリュームに対する作成、削除、およびその他のファイル管理操作の実行

ボリュームに格納されているファイルに対してファイル管理操作を実行するには、次のアクセス許可が必要です。

リソース

必要な権限

容積

READ, WRITE

スキーマ

USE SCHEMA

カタログ

USE CATALOG

ボリュームのファイル管理操作は、次のツールを使用して実行できます。

ボリューム上のファイルをプログラムで操作する方法の詳細については、「 Unity Catalog ボリューム内のファイルの操作」を参照してください。

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

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

チュートリアル: Unity Catalog ボリューム ノートブック

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

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

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

  • dbfs:/Volumes

  • /Volumes

注:

また、パスは、Apache Spark APIs や dbutils からのこれらのパスの潜在的な入力ミス (/volumes/Volume/volume など) のために予約されています (dbfs:/ が前に付いているかどうかは別として)。 パス /dbfs/Volumes も予約されていますが、ボリュームへのアクセスには使用できません。

ボリュームは、Databricks Runtime 13.2 以降でのみサポートされます。 Databricks Runtime 13.1 以下では、 /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 UDFsは、シングルユーザーアクセスモードでサポートされています。

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

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

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

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

  • Wheel または 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)