什么是 Unity Catalog 卷?

在 Unity Catalog 中,卷是用于管理非表格数据集的对象。 卷表示云对象存储位置的存储逻辑卷。 卷提供用于访问、存储、治理和组织文件的功能。

虽然表控制表格数据,但卷控制任何格式的非表格数据,包括结构化、半结构化或非结构化数据。

Databricks 建议使用卷来控制对所有非表格数据的访问。 卷分为两种类型:

  • 托管卷: 适用于简单管理的 Databricks 存储。
  • 外部卷: 用于为现有的云对象存储位置添加治理功能。

卷的用例

卷的用例包括:

  • 为外部系统生成的原始数据注册登陆区域,以支持其在 ETL 管道和其他数据工程活动的早期阶段的处理。
  • 注册用于引入的暂存位置。 例如,使用自动加载程序 COPY INTO 或 CTAS(CREATE TABLE AS)语句。
  • 为数据科学家、数据分析师和机器学习工程师提供文件存储位置,以用作其探索数据分析和其他数据科学任务的一部分。
  • 使 Azure Databricks 用户能够访问由其他系统生成并存储在云存储中的任意文件。 例如,由监视系统或 IoT 设备捕获的大型非结构化数据(例如图像、音频、视频和 PDF 文件)集合,或者从本地依赖项管理系统或 CI/CD 管道导出的库文件(JAR 和 Python 滚轮文件)。
  • 存储操作数据,例如日志文件或检查点文件。

有关使用卷的演示,请参阅 使用 Unity 目录卷简化文件、映像和数据检索

重要

不能将卷中的文件注册为 Unity Catalog 中的数据库表。 卷仅用于基于路径的数据访问。 如果要在 Unity Catalog 中处理表格数据,请使用表。

托管卷与外部卷

使用 Azure Databricks 工具、用户界面和应用程序编程接口时,托管卷和外部卷提供几乎相等的体验。 主要区别与存储位置、生命周期和控制相关:

功能 / 特点 管理的存储卷 外部卷
存储位置 在 UC 托管的模式存储中创建 在现有云对象存储路径上注册
数据生命周期 UC 管理布局和删除(删除后有 7 天的保留期) 删除磁盘卷时,数据将保留在云存储中
存取控制 所有访问都通过 UC UC 控制访问,但外部工具可以使用直接 URI
需要迁移? 否 - 使用现有存储路径 as-is
典型用例 仅限 Databricks 的工作负载的最简单选项 混合 Databricks 和外部系统访问

为何使用托管卷?

托管卷具有以下优势:

  • Databricks 工作负载的默认选择。
  • 无需手动管理云凭据或存储路径。
  • 用于快速创建受管理存储位置的最简单选项。

为什么使用外部存储卷?

外部卷允许向现有云对象存储目录添加 Unity Catalog 数据治理。 以下是外部存储卷的一些用例:

  • 在数据已经存在的地方添加治理,而无需复制数据。
  • 管理其他系统生成的文件,这些系统必须由 Azure Databricks 引入或访问。
  • 管理 Azure Databricks 生成的数据,这些数据必须由其他系统直接从云对象存储访问。

Databricks 建议使用外部卷来存储除 Azure Databricks 以外的外部系统读取或写入的非表格数据文件。 Unity 目录不控制直接从外部系统针对云对象存储执行的读取和写入,因此必须在云帐户中配置其他策略和凭据,以便数据治理策略在 Azure Databricks 外部得到尊重。

用于访问卷中的文件的路径

在 Unity Catalog 的三级命名空间中,卷位于第三层级别 (catalog.schema.volume):

Unity Catalog 对象模型图,侧重于卷

无论使用 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 目录对象名称。 这些目录是只读的,由 Unity 目录自动管理。 无法使用文件系统命令创建或删除它们。

注意

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

卷的保留路径

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

  • dbfs:/Volumes
  • /Volumes

注意

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

仅在 Databricks Runtime 13.3 LTS 及更高版本上支持卷。 在 Databricks Runtime 12.2 LTS 及更低版本中,对/Volumes路径进行的操作可能会成功,但只能将数据写入附加到计算群集的临时存储卷,而不能按预期将数据持久保存到 Unity Catalog 卷。

重要

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

计算要求

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

限制

必须使用已启用 Unity Catalog 的计算资源来与 Unity Catalog 卷进行交互。

下表概述了基于 Databricks Runtime 版本的 Unity Catalog 容量限制。

Databricks Runtime 版本 限制
所有支持的 Databricks Runtime 版本
  • 卷不支持将 dbutils.fs 命令分发给执行单元。
  • Unity Catalog 中的 UDF 不支持访问卷文件路径。
  • 您无法从 RDD 中访问存储卷。
  • 不能将传统的 spark-submit 任务与存储在卷中的 JAR 配合使用。 请改用 JAR 任务。 请参阅适用于作业的 JAR 任务
  • 无法为通过 Wheel 或 JAR 文件中的目录路径访问的其他库定义依赖项。
  • 无法使用/Volumes/<catalog-name>/Volumes/<catalog-name>/<schema-name>模式列出 Unity Catalog 对象。 必须使用包含卷名称的完全限定路径(采用 Volumes/<catalog-name>/<schema-name>/<volume-name> 形式)。 例如: dbutils.fs.ls("/Volumes/MyCatalog/MySchema/MyVolume")
  • %sh mv 不支持在卷之间移动文件。 请改用 dbutils.fs.mv%sh cp
  • 无法使用卷创建自定义 Hadoop 文件系统。 例如,使用 new Path("dbfs:/Volumes/main/default/test-volume/file.txt") 创建 org.apache.hadoop.fs.path 对象将不起作用。
  • 您必须在 Azure 数据工厂库配置面板中使用具有 dbfs:/ 协议的路径格式,例如 dbfs:/Volumes/<catalog-name>/<schema-name>/<volume-name>/file
14.3 LTS 及更高版本
  • 在具有专用访问模式(以前为单用户访问模式)的计算中,无法从 Scala 中的线程和子进程访问卷。
14.2 及更低版本
  • 在配置了标准访问模式(以前称为共享访问模式)的计算资源中,您无法使用 UDF 来访问存储卷。
    • Python 或 Scala 都有权从驱动程序访问 FUSE,但无权从执行程序访问 FUSE。
    • 执行 I/O 操作的 Scala 代码可以在驱动程序上运行,但不能在执行程序上运行。
  • 在配置了专用访问模式的计算上,不支持 Scala 中的 FUSE、使用卷路径访问数据的 Scala IO 代码,或 Scala UDF。 专用访问模式支持 Python UDF。

后续步骤

以下文章提供了有关卷处理的更多信息: