本文概述了使用 Unity 目录处理数据所需的云存储连接,以及 Unity 目录如何控制对云存储和外部云服务的访问的信息。
Unity 目录如何使用云存储?
Databricks 建议使用 Unity 目录来管理对存储在云对象存储中的所有数据的访问。 Unity Catalog 提供了一套工具,用于配置与云对象存储的安全连接。 这些连接提供完成以下操作的访问权限:
- 将数据引入湖屋。
- 在 Unity Catalog 管理的云存储中创建和读取托管的 表 和 非结构化数据卷。
- 注册或创建包含表格数据和外部卷的外部表,其中包含使用云提供程序管理的云存储中的非结构化数据。
- 读取和写入非结构化数据(Unity Catalog 存储卷)。
为了更具体化,Unity 目录以两种主要方式使用云存储:
- 在 Databricks 中创建的托管表和托管卷(非结构化的非表格数据)的默认(或“托管”)存储位置。 可以在元存储、目录或架构级别定义这些托管存储位置。 在云提供商中创建托管存储位置,但其生命周期完全由 Unity 目录管理。
- 存储外部表和卷的位置。 这些表和卷从 Azure Databricks 的访问由 Unity 目录管理,但其数据生命周期和文件布局是使用云提供程序和其他数据平台管理的。 通常情况下,您可以使用外部表来在 Azure Databricks 中注册大量的现有数据,或者当您需要使用 Azure Databricks 以外的工具对数据进行写入访问时,也可以使用外部表。
有关托管表与外部表及其卷的更多信息,请参阅 Azure Databricks 表简介 和 什么是 Unity Catalog 卷?。
警告
不要为非 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 的存储凭据 |
Cloudflare R2 存储桶 | Cloudflare R2 主要用于希望避免数据外流费用的 Delta Sharing 场景。 请参阅 创建用于连接到 Cloudflare R2 的存储凭据。 |
DBFS 根 | DBFS 根 是一种旧版云存储位置。 尽管 Databricks 建议不要将数据存储在 DBFS 根存储中,但由于旧的做法,工作区可能会这样做。 请参阅 在 DBFS 根目录(旧版)中创建数据的外部位置。 |
Unity Catalog 如何管理对云存储的访问?
为了管理对保存表和卷的基础云存储的访问,Unity 目录使用一 个名为外部位置的安全对象,该对象定义云存储位置的路径以及访问该位置所需的凭据。 这些凭据又在名为 存储凭据的 Unity Catalog 安全对象中定义。 通过授予和撤消对 Unity Catalog 中外部位置安全对象的访问权限,可以控制对云存储位置中数据的访问。 通过授予和撤消对 Unity Catalog 中存储凭据安全对象的访问权限,可以控制创建外部位置对象的能力。
存储凭据和外部位置
以下是有关这两个安全对象的详细信息:
- 存储凭据代表一种用于访问云租户上存储的数据的身份验证和授权机制,例如使用 Azure Data Lake Storage 容器的 Azure 托管身份或服务主体,或使用 Cloudflare R2 存储桶的 R2 API 令牌。 Unity Catalog 授予的权限控制哪些用户和组可以使用凭据来定义外部位置。 仅应向需要创建外部位置对象的用户授予创建和使用存储凭据的权限。 有关详细信息,请参阅 Unity 目录支持的云存储选项中的链接。
- 外部位置可将云存储路径与授权访问云存储路径的存储凭据相结合。 Unity Catalog 授予的权限控制哪些用户和组可以访问外部位置定义的云存储路径。 仅应向需要创建外部表、外部卷或托管存储位置的用户授予创建和使用外部位置的权限。 请参阅创建外部位置以将云存储连接到 Azure Databricks。
Unity Catalog 中的外部位置既可用于外部数据资产(如外部表和外部卷),也可用于托管数据资产(如托管表和托管卷)。 有关 Unity 目录中外部和托管数据资产之间的差异的详细信息,请参阅 Azure Databricks 表简介 以及 什么是 Unity 目录卷?。
若要了解使用外部位置的最佳做法,请参阅 外部位置。
创建外部表和外部卷时使用外部位置
Unity Catalog 中注册的外部表和外部卷本质上是指向在 Azure Databricks 外部管理的云存储中数据的指针。 在 Unity Catalog 中创建外部表或外部卷时,必须引用已被授予足够权限的外部位置对象中包含的云存储路径。 有关 Unity 目录中外部和托管数据资产之间的差异的详细信息,请参阅 Azure Databricks 表简介 以及 什么是 Unity 目录卷?。 有关权限,请参阅对外部位置授予权限。
创建托管存储时使用外部位置
Unity Catalog 完全管理托管表和托管卷。 默认情况下,它们存储在托管存储位置中,可在元存储、目录或架构级别进行定义。 将托管存储位置分配给元存储、目录或架构时,必须引用外部位置对象,且必须具有足够权限才能使用。 请参阅在 Unity Catalog 中指定托管存储位置和 Unity Catalog 最佳做法。
对云存储中数据的基于路径的访问
尽管 Unity 目录支持使用云存储 URI 对外部表和外部卷进行基于路径的访问,但 Databricks 建议用户使用表名读取和写入所有 Unity 目录表,并使用路径访问卷 /Volumes
中的数据。
卷是大多数 Azure Databricks 用户应该用来与云对象存储中的非表格数据直接交互的安全对象。 请参阅什么是 Unity Catalog 卷?。
警告
如果使用非 Databricks 客户端或从 Databricks 内部通过路径访问来更新外部表元数据,则这些元数据不会自动同步到 Unity Catalog 的状态。 Databricks 建议不要进行此类元数据更新,但如果执行了更新,则必须运行 MSCK REPAIR TABLE <table-name> SYNC METADATA
才能使 Unity 目录中的架构处于最新状态。 请参阅 REPAIR TABLE。
Unity Catalog 中管理对云存储访问的工作流
若要使用 Unity Catalog 管理对云存储的访问,请执行以下操作:
创建包含长期云凭据(例如 Azure 托管标识 或服务主体)的存储凭据对象,该对象有权访问云存储路径。
创建引用存储路径和存储凭据对象的外部位置对象。
创建外部表、外部卷或默认托管存储位置时,引用外部位置中包含的路径。 这可以是在外部位置或子路径中定义的确切路径。
使用 Unity 目录实现 Azure 云存储的最佳做法
Azure Databricks 要求使用 Azure Data Lake Storage 作为 Azure 存储服务,用于在 Azure Databricks 中通过 Unity Catalog 治理来处理数据。 使用 Azure Data Lake Storage,可以分离存储和计算成本,并利用 Unity 目录提供的精细访问控制。 如果数据存储在 OneLake(Azure Fabric 数据湖)中,并由 Databricks 处理(绕过 Unity Catalog),则会产生捆绑的存储和计算成本。 与用于存储、读取和写入数据的 Azure Data Lake Storage 相比,读取和写入成本可能高出约 3 倍,写入成本更高 1.6 倍。 Azure Blob 存储也与 Unity Catalog 不兼容。
功能 / 特点 | Azure Blob 存储 | Azure Data Lake Storage | OneLake |
---|---|---|---|
在 Unity Catalog 中不受支持 | X | ✓ | X |
需要购买其他 Fabric 容量 | X | X | ✓ |
部署 | 区域 | 区域 | 全球 |
身份验证 | Entra ID 共享访问签名 | Entra ID 共享访问签名 | Entra ID |
存储事件 | ✓ | ✓ | X |
软删除 | ✓ | ✓ | ✓ |
存取控制 | RBAC | RBAC、ABAC、ACL | RBAC(仅表/文件夹,不支持快捷方式 ACL) |
加密密钥 | ✓ | ✓ | X |
访问层级 | 联机存档 | 热、冷、寒、存档 | 仅热 |