使用 Unity 目录连接到云对象存储

本文概述了使用 Unity Catalog 处理数据所需的云存储连接,以及 Unity Catalog 如何管理对云存储和外部云服务的访问的信息。

Unity Catalog 如何使用云存储?

Databricks 建议使用 Unity Catalog 卷来管理对云对象存储中已存储的所有数据的访问权限。 Unity Catalog 提供了一套工具,用于配置与云对象存储的安全连接。 这些连接提供完成以下操作的访问权限:

  • 将数据引入湖屋。
  • 在 Unity Catalog 管理的云存储中创建和读取托管的 非结构化数据卷
  • 注册或创建包含表格数据和外部卷外部表,其中包含使用云提供程序管理的云存储中的非结构化数据。
  • 读取和写入非结构化数据(Unity Catalog 存储卷)。

为了更具体化,Unity Catalog 以两种主要方式使用云存储:

  • 在 Databricks 中创建的托管表和托管卷(非结构化的非表格数据)的默认(或“managed”)存储位置。 这些托管存储位置可以在元存储、目录或架构级别上定义。 在云提供商中创建托管存储位置,但其生命周期完全由 Unity Catalog 管理。
  • 存储外部表和卷的存储位置。 这些是指使用 Unity Catalog 管理其 Azure Databricks 访问权限,但使用云提供程序和其他数据平台管理其数据生命周期和文件布局的表和卷。 通常情况下,您可以使用外部表来在 Azure Databricks 中注册大量的现有数据,或者当您需要使用 Azure Databricks 以外的工具对数据进行写入访问时,也可以使用外部表。

有关托管表和外部表和卷的详细信息,请参阅 Azure Databricks 表什么是 Unity 目录卷?

警告

不要为非 Unity 目录身份提供存储级别的访问权限,以访问 Unity 目录托管的表或卷。 这样做会损害数据安全和治理。

授予用户、服务主体或托管标识直接访问包含受 Unity 目录管理的数据的 Azure Data Lake Storage 容器 会绕过 Unity 目录。 这会向过度权限、外泄和未经授权的访问公开数据,同时使审核复杂化并增加管理开销。

Unity "Catalog"托管表不支持直接存储访问。

Unity 目录支持的云存储选项

Unity 目录支持 Azure Databricks 的以下云存储选项。

云存储选项 DESCRIPTION
Azure Data Lake Storage 容器 Azure Data Lake Storage 适用于大多数 Azure Databricks 用例。 请参阅 创建用于连接到 Azure Data Lake Storage 的存储凭据
AWS S3 存储桶 Azure Databricks 支持跨平台只读访问 S3 存储桶。 请参阅创建用于连接到 AWS S3 的存储凭据(只读)。
Cloudflare R2 存储桶 Cloudflare R2 主要用于希望避免数据外流费用的 Delta Sharing 场景。 请参阅 创建用于连接到 Cloudflare R2 的存储凭据
DBFS 根 DBFS 根 是一种旧版云存储位置。 尽管 Databricks 建议不要将数据存储在 DBFS 根存储中,但由于旧的做法,工作区可能会这样做。 请参阅“连接到 DBFS 根外部位置”(旧版)。

Unity 目录如何控制对云存储的访问?

为了管理对存储表和卷的底层云存储的访问,Unity Catalog 使用名为外部位置的安全对象,该对象定义云存储位置的路径以及访问该位置所需的凭据。 这些凭据又在名为 存储凭据的 Unity Catalog 安全对象中定义。 通过授予和撤消对 Unity Catalog 中外部位置安全对象的访问权限,可以控制对云存储位置中数据的访问。 通过授予和撤消对 Unity Catalog 中存储凭据安全对象的访问权限,可以控制创建外部位置对象的能力。

存储凭据概述

存储凭据表示用于访问存储在云租户中的数据的身份验证和授权机制。 例如,存储凭据与 Azure Data Lake Storage 容器的 Azure 托管标识 或服务主体相关联,或者与 Cloudflare R2 存储桶的 R2 API 令牌相关联。

Unity 目录授予的权限控制哪些用户和组可以使用凭据来定义 外部位置。 应仅向需要创建外部位置对象的用户授予创建和使用存储凭据的权限。

外部位置概述

外部位置将云存储路径与授权访问指定路径的存储凭据组合在一起。 多个外部位置可以使用相同的存储凭据。 外部位置可以在任何受支持的 云存储选项中引用存储路径。

下图显示了外部位置如何引用存储凭据和云存储位置。

存储凭据、外部位置和云存储之间的关系

在此图中:

  • 每个外部位置引用存储凭据和云存储位置。
  • 多个外部位置可以引用相同的存储凭据。 存储凭据 1 授予对路径 bucket/tables/*下的所有内容的访问权限,因此 外部位置 A外部位置 B 都引用它。

在 Unity 目录中,外部位置被用于外部数据资产,例如 外部表外部卷,以及托管数据资产,例如 托管表托管卷。 有关 Unity 目录中外部和托管数据资产之间的差异的详细信息,请参阅 Azure Databricks 表什么是 Unity 目录卷?

Unity 目录中授予的权限控制哪些用户和组可以访问外部位置定义的云存储路径。 应仅向需要创建外部表、外部卷或托管存储位置的用户授予创建和使用外部位置的权限。

若要了解使用外部位置的最佳做法,请参阅 外部位置

创建外部表和数据卷时使用外部位置

在 Unity Catalog 中注册的外部表和外部卷,本质上是指向由您在 Azure Databricks 之外管理的云存储中的数据的指针。 在 Unity 目录中创建外部表或外部卷时,必须引用已被授予足够权限的外部位置对象中包含的云存储路径。 有关 Unity 目录中外部和托管数据资产之间的差异的详细信息,请参阅 Azure Databricks 表什么是 Unity 目录卷?。 关于权限,请参阅 授予外部位置的权限

创建托管存储时使用外部位置

托管表和托管卷完全由 Unity 目录管理。 默认情况下,它们存储在 托管存储位置中,可在元存储、目录或架构级别定义。 将托管存储位置分配给元存储、目录或架构时,必须引用外部位置对象,并且必须具有足够的权限才能使用它。 请参阅 在 Unity 目录中指定托管存储位置Unity 目录最佳做法

对云存储中数据的基于路径的访问

虽然 Unity Catalog 支持使用云存储 URI 对外部表和外部卷进行基于路径的访问,但 Databricks 建议使用表名读取和写入所有 Unity Catalog 表,并使用 /Volumes 路径访问卷中的数据。 卷是大多数 Azure Databricks 用户应该用来与云对象存储中的非表格数据直接交互的安全对象。 请参阅什么是 Unity Catalog 卷?

警告

如果使用非 Databricks 客户端或从 Databricks 内部通过路径访问来更新外部表元数据,则这些元数据不会自动同步到 Unity Catalog 的状态。 Databricks 建议不要进行此类元数据更新,但如果执行了更新,则必须运行 MSCK REPAIR TABLE <table-name> SYNC METADATA 才能使 Unity 目录中的架构处于最新状态。 请参阅 REPAIR TABLE

管理 Unity 目录中云存储访问权限的工作流

若要使用 Unity 目录管理对云存储的访问,请执行以下作:

  1. 创建包含长期云凭据(例如 Azure 托管标识 或服务主体)的存储凭据对象,该对象有权访问云存储路径。
  2. 创建引用存储路径和存储凭据对象的外部位置对象。
  3. 创建外部表、外部卷或默认托管存储位置时,引用外部位置中包含的路径。 这可以是在外部位置或子路径中定义的确切路径。

使用 Unity 目录实现 Azure 云存储的最佳做法

Azure Databricks 要求使用 Azure Data Lake Storage 作为 Azure 存储服务,用于在 Azure Databricks 中通过 Unity Catalog 治理来处理数据。 使用 Azure Data Lake Storage,可以分离存储和计算成本,并利用 Unity 目录提供的精细访问控制。 如果数据存储在 OneLake(Microsoft Fabric 数据湖)中,并由 Databricks 处理(绕过 Unity 目录),则可能会产生捆绑存储和计算成本。 如果捆绑在一起,则这可能会导致读取和写入成本高出约 2.6 倍,而 Azure Data Lake Storage 高级层则用于存储、读取和写入数据。 Azure Blob 存储也与 Unity Catalog 不兼容。 Databricks 建议使用 Fabric 的即用即付定价模型,从而更灵活地使用存储和计算选项。

功能 / 特点 Azure Blob 存储 Azure Data Lake Storage OneLake
在 Unity Catalog 中不受支持 X X
需要购买其他 Fabric 容量 X X
外部引擎支持的操作
  • 读取
  • 写入
  • 读取
  • 写入
  • 读取
  • 写入

使用捆绑计算/存储定价模型时,与从 Azure Data Lake Storage 读取数据相比,读取成本高达 2 倍,与将数据写入 Azure Data Lake Storage 高级层相比,写入成本高达 2.6 倍。
有关详细信息,请参阅 OneLake 文档
部署 区域 区域 全球
身份验证 Entra ID 共享访问签名 Entra ID 共享访问签名 Entra ID
存储事件 X
软删除
存取控制 RBAC RBAC、ABAC、ACL RBAC(仅表/文件夹,不支持快捷方式 ACL)
加密密钥 X
访问层级 联机存档 热、冷、寒、存档 仅热

后续步骤