什么是 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 目录卷路径来存储 数据帧检查点。 数据帧检查点截断数据帧的执行计划,并将内容保存到存储中。 这可以通过在重用 DataFrame 时防止过度长的世系来提高迭代算法和复杂查询计划的性能。

在 Unity 目录卷中存储检查点可对检查点数据应用治理和访问控制,从而帮助你远离非托管云存储路径。

要求

  • Databricks Runtime 18.1 或更高版本。
  • 使用 Unity Catalog 启用的计算功能,并支持专用或标准访问模式。 无服务器计算不支持卷中的数据帧检查点。

配置检查点目录

设置检查点目录的方法取决于您计算设备的访问模式:

专用访问模式

在具有专用访问模式的计算中,请使用 SparkContext.setCheckpointDir

spark.checkpoint.dir=/Volumes/<catalog>/<schema>/<volume>/checkpoint

标准访问模式

使用标准访问模式的 spark.checkpoint.dir 计算时,请使用 Spark 配置:

spark.conf.set("spark.checkpoint.dir", "/Volumes/<catalog>/<schema>/<volume>/checkpoints")

创建 DataFrame 检查点

配置检查点目录后,用 DataFrame.checkpoint() 截断执行计划并保存数据。

df = spark.range(100).withColumn("doubled", col("id") * 2)
checkpointed_df = df.checkpoint()

注意

DataFrame 检查点与结构化流处理检查点有所不同。 有关在卷中存储流式处理检查点数据的信息,请参阅 结构化流式处理检查点

限制

必须使用已启用 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。

后续步骤

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