创建和使用卷

本文介绍卷,它们是支持对非表格数据集进行治理的 Unity Catalog 对象。 还将介绍如何创建、管理和使用卷。

有关上传和管理卷中的文件的详细信息,请参阅将文件上传到 Unity Catalog 卷Unity Catalog 卷的文件管理操作

注意

使用卷时,必须使用 SQL 仓库或运行 Databricks Runtime 13.3 LTS 或更高版本的群集,除非使用的是 Azure Databricks UI,例如目录资源管理器。

什么是 Unity Catalog 卷?

卷是 Unity Catalog 对象,表示云对象存储位置中的逻辑存储卷。 卷提供用于访问、存储、管理和组织文件的功能。 虽然表提供对表格数据集的治理,但卷增加了对非表格数据集的治理。 可以使用卷来存储和访问任何格式的文件,包括结构化、半结构化和非结构化数据。

重要

不能将卷用作表的位置。 卷仅用于基于路径的数据访问。 通过 Unity Catalog 使用表来存储表格数据。

什么是托管表?

托管卷是在包含架构的默认存储位置中创建的 Unity Catalog 控制的存储卷。 托管卷允许创建受管理存储以处理文件,而无需外部位置和存储凭据的开销。 创建托管卷时无需指定位置,并且托管卷中数据的所有文件访问都通过 Unity Catalog 管理的路径进行。 请参阅使用哪个路径访问卷中的文件?

删除托管卷时,存储在该卷中的文件也会在 30 天内从云租户中删除。

什么是外部卷?

外部卷是使用 Unity Catalog 控制的存储凭据针对外部位置中的目录注册的 Unity Catalog 控制的存储卷。 外部卷允许将 Unity Catalog 数据治理添加到现有云对象存储目录。 外部卷的一些用例包括:

  • 在不迁移的情况下向数据文件添加治理。
  • 管理必须由 Azure Databricks 引入或访问的其他系统生成的文件。
  • 管理 Azure Databricks 生成的数据,这些数据必须由其他系统直接从云对象存储进行访问。

外部卷必须是受 Unity Catalog 存储凭据控制的外部位置中的目录。 Unity Catalog 不管理外部卷中文件的生命周期和布局。 删除外部表卷,Unity Catalog 不会删除基础数据。

注意

定义卷时,对卷路径下数据的云 URI 访问受卷权限约束。

使用哪个路径访问卷中的文件?

无论使用 Apache Spark、SQL、Python 还是其他语言和库,访问卷的路径都是相同的。 这与绑定到 Azure Databricks 工作区的对象存储中的文件的旧访问模式不同。

访问卷中的文件的路径使用以下格式:

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

使用 Apache Spark 时,Azure Databricks 还支持可选 dbfs:/ 方案,因此以下路径也有效:

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

路径中的序列 /<catalog>/<schema>/<volume> 对应于与文件关联的三个 Unity Catalog 对象名称。 这些路径元素是只读的,用户不能直接写入,这意味着无法使用文件系统操作创建或删除这些目录。 它们会自动进行管理,并与相应的 UC 实体保持同步。

注意

还可以使用云存储 URI 访问外部卷中的数据。

卷有哪些权限?

卷使用与表相同的基本权限模型,但表的权限侧重于授予对表中行的查询和操作权限,而卷的权限侧重于使用文件。 因此,卷引入了以下特权:

请参阅 Unity Catalog 特权和安全对象

谁可以管理卷权限?

必须对卷具有所有者权限才能管理卷权限或删除卷。 Unity Catalog 中的每个对象只能有一个被分配为所有者的主体,虽然所有权不会级联(也就是说,目录的所有者不会自动成为该目录中所有对象的所有者),但与所有权关联的特权适用于对象中包含的所有对象。

这意味着,对于 Unity Catalog 卷,以下主体可以管理卷特权:

  • 父目录的所有者。
  • 父架构的所有者。
  • 卷的所有者。

虽然每个对象只能有一个所有者,但 Databricks 建议将大多数对象的所有权分配给一个组而不是单个用户。 任何对象的初始所有权都分配给创建该对象的用户。 请参阅管理 Unity Catalog 对象所有权

创建托管表

必须具有以下权限才能创建托管卷:

资源 所需的权限
架构 USE SCHEMACREATE VOLUME
目录 USE CATALOG

Sql

若要创建托管卷,请使用以下语法:

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

目录资源管理器

要在目录资源管理器中创建托管卷,请执行以下操作:

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。
  2. 搜索或浏览要向其添加卷的架构并将其选中。
  3. 单击“创建卷”按钮。 (必须具有足够的特权。)
  4. 输入卷的名称。
  5. 添加注释(可选)。
  6. 单击“创建”。

创建外部卷

必须具有以下权限才能创建外部卷:

资源 所需的权限
外部位置 CREATE EXTERNAL VOLUME
架构 USE SCHEMACREATE VOLUME
目录 USE CATALOG

Sql

若要创建外部卷,请使用以下语法在外部位置指定路径:

CREATE EXTERNAL VOLUME <catalog>.<schema>.<external-volume-name>
LOCATION 'abfss://<container-name>@<storage-account>.dfs.core.chinacloudapi.cn/<path>/<directory>';

目录资源管理器

要在目录资源管理器中创建外部卷,请执行以下操作:

  1. 在 Azure Databricks 工作区中,单击“目录”图标“目录”。
  2. 搜索或浏览要向其添加卷的架构并将其选中。
  3. 单击“创建卷”按钮。 (必须具有足够的特权。)
  4. 输入卷的名称。
  5. 选择要在其中创建卷的外部位置。
  6. 编辑路径以反映要在其中创建卷的子目录。
  7. 添加注释(可选)。
  8. 单击 “创建”

删除卷

只有具有所有者权限的用户才能删除卷。 请参阅谁可以管理卷特权?

使用以下语法删除卷:

DROP VOLUME IF EXISTS <volume-name>;

删除托管卷时,Azure Databricks 在 30 天内删除基础数据。 删除外部卷时,将从 Unity Catalog 中删除该卷,但基础数据在外部位置保持不变。

读取卷中的文件

必须具有以下权限才能查看卷的内容或访问存储在卷上的文件:

资源 所需的权限
音量 READ
架构 USE SCHEMA
目录 USE CATALOG

使用路径与卷的内容进行交互。 请参阅使用哪个路径访问卷中的文件?

在卷上创建、删除、执行其他文件管理操作

必须具有以下权限才能对存储在卷上的文件执行文件管理操作:

资源 所需的权限
音量 READWRITE
架构 USE SCHEMA
目录 USE CATALOG

可以使用以下工具对卷执行文件管理操作:

有关以编程方式与卷上的文件交互的完整详细信息,请参阅使用 Unity Catalog 卷中的文件

示例笔记本:创建和使用卷

以下笔记本演示了创建 Unity Catalog 卷并与之交互的基本 SQL 语法。

教程:Unity Catalog 卷笔记本

获取笔记本

卷的保留路径

卷引入了以下用于访问卷的保留路径:

  • dbfs:/Volumes
  • /Volumes

注意

路径也保留用于 Apache Spark API 和 dbutils(包括 /volumes/Volume/volume)中这些路径的潜在拼写错误,无论它们前面是否为 dbfs://dbfs/Volumes 路径也是保留的,但不能用于访问卷。

仅在 Databricks Runtime 13.2 及更高版本上支持卷。 在 Databricks Runtime 13.1 及更低版本中,针对 /Volumes 路径的操作可能会成功,但可以将数据写入附加到计算群集的临时存储磁盘,而不是按预期将数据保存到 Unity Catalog 卷。

重要

如果预先存在的数据存储在 DBFS 根上的保留路径中,则可以提交支持票证以获取对此数据的临时访问权限,以将其移动到另一个位置。

限制

必须使用已启用 Unity Catalog 的计算来与 Unity Catalog 卷进行交互。 卷并非支持所有工作负载。

对使用 /Volumes/catalog/schema/volume 路径来访问卷中的数据的支持仅限于以下对象:

  • Spark SQL
  • Spark DataFrame
  • dbutils.fs 命令

注意

卷不支持分发给执行程序的 dbutils.fs 命令。

适用以下限制:

在 Databricks Runtime 14.3 LTS 及更高版本中:

  • 在单用户用户群集上,无法在 Scala 中从线程和子进程访问卷。

在 Databricks Runtime 14.2 及更低版本中:

  • 在配置了共享访问模式的计算中,无法使用 UDF 访问卷。
    • Python 或 Scala 都有权从驱动程序访问 FUSE,但无权从执行程序访问 FUSE。
    • 执行 I/O 操作的 Scala 代码可以在驱动程序上运行,但不能在执行程序上运行。
  • 在配置了单用户访问模式的计算上,不支持 Scala 中的 FUSE、使用卷路径访问数据的 Scala IO 代码,或 Scala UDF。 单个用户访问模式支持 Python UDF。

在所有支持的 Databricks Runtime 版本上:

  • Unity Catalog UDF 不支持访问卷文件路径。

  • 无法从 RDD 访问卷。

  • 不能将 spark-submit 与存储在卷中的 JAR 配合使用。

  • 不能定义通过 Wheel 或 JAR 文件中的卷路径访问的其他库的依赖项。

  • 不能使用 /Volumes/<catalog-name>/<schema-name> 模式列出 Unity Catalog 对象。 必须使用包含卷名称的完全限定路径。

  • REST API 的 DBFS 终结点不支持卷路径。

  • 卷从 Azure Databricks 工作区全局搜索结果中排除。

  • 不能将卷指定为群集日志传递的目标。

  • %sh mv 不支持在卷之间移动文件。 请改用 dbutils.fs.mv%sh cp

  • 目录资源管理器每个目录仅显示 1000 个文件。

  • 不能使用卷创建自定义 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)
    
  • 必须在 Azure 数据工厂库配置面板中将路径格式与 dbfs:/ 方案配合使用。 例如 dbfs:/Volumes/<catalog-name>/<schema-name>/<volume-name>/file