在 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):
无论使用 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 版本 |
|
| 14.3 LTS 及更高版本 |
|
| 14.2 及更低版本 |
|
后续步骤
以下文章提供了有关卷处理的更多信息: