什么是 Unity Catalog?

本文介绍 Unity Catalog - Azure Databricks 上的数据和 AI 资产的统一治理解决方案。

注意

Unity Catalog 也可用作开源实施。 请参阅公告博客和公共 Unity Catalog GitHub 存储库

Unity Catalog 概述

Unity Catalog 提供跨 Azure Databricks 工作区的集中访问控制、审核、世系和数据发现功能。

Unity Catalog 示意图

Unity Catalog 的主要功能包括:

  • 定义一次,全面安全:Unity Catalog 提供单一位置来管理跨所有工作区应用的数据访问策略。
  • 符合标准的安全模型:Unity Catalog 的安全模型基于标准 ANSI SQL,并允许管理员使用熟悉的语法在其现有数据湖中授予目录、架构(也称为数据库)、表和视图级别的权限。
  • 内置审核和世系:Unity Catalog 可自动捕获记录数据访问的用户级审核日志。 Unity Catalog 还会捕获世系数据,用于跟踪在所有语言中创建和使用数据资产的方式。
  • 数据发现:使用 Unity Catalog,可以标记和记录数据资产,并提供搜索界面来帮助数据使用者查找数据。
  • 系统表(公共预览版):Unity Catalog 让你可以轻松访问和查询帐户中的运营数据,包括审核日志、计费使用量和数据世系。

Unity Catalog 对象模型

在 Unity Catalog 中,所有元数据都在元存储中注册。 任何 Unity Catalog 元存储中的数据库对象层次结构都分为三个级别,当你引用表、视图、卷、模型和函数时,它们表示为三级命名空间 (catalog.schema.table-etc)。

Unity Catalog 对象模型图

元存储

元存储是 Unity Catalog 中元数据的顶级容器。 它注册有关数据资产和 AI 资产的元数据,以及用于管理对资产的访问的权限。 如果一个工作区想要使用 Unity Catalog,它必须附加 Unity Catalog 元存储。

应为拥有工作区的每个区域都设置一个元存储。 通常,首次在某个区域中创建 Azure Databricks 工作区时,会自动创建元存储。 对于某些较旧的帐户,帐户管理员必须创建元存储,并将该区域中的工作区分配给该元存储。

请参阅创建 Unity Catalog 元存储

元存储中的对象层次结构

在 Unity Catalog 元存储中,三级数据库对象层次结构由包含架构的目录组成,而架构又包含数据和 AI 对象,如表和模型。

第一级:

  • 目录用于组织数据资产,通常用作数据隔离方案中的顶层。 目录通常镜像组织单位或软件开发生命周期范围。 请参阅 Azure Databricks 中的目录是什么?
  • 非数据安全对象(例如存储凭据和外部位置)用于管理 Unity Catalog 中的数据治理模型。 这些内容也直接位于元存储下。 其他安全对象中对它们进行了更详细的介绍。

第二级:

  • 架构(也称为数据库)包含表、视图、卷、AI 模型和函数。 架构将数据和 AI 资产组织成比目录更细粒度的逻辑类别。 通常,架构代表单个用例、项目或团队沙盒。 请参阅 Azure Databricks 中的架构是什么?

第三级:

使用 Unity Catalog 中的数据库对象

使用 Unity Catalog 中的数据库对象与使用在 Hive 元存储中注册的数据库对象非常相似,不同之处在于 Hive 元存储不包含对象命名空间中的目录。 可以使用熟悉的 ANSI 语法在 Unity Catalog 中创建数据库对象、管理数据库对象、管理权限和使用数据。 还可以使用 Catalog Explorer UI 创建数据库对象、管理数据库对象和管理数据库对象的权限。

有关更多信息,请参阅 Azure Databricks 中的数据库对象使用 Unity Catalog 和旧版 Hive 元存储

其他安全对象

除了架构中包含的数据库对象和 AI 资产之外,Unity Catalog 还使用以下安全对象来管理对数据的访问:

有关 Delta Sharing 安全对象的详细信息,请参阅什么是 Delta Sharing?

授予和撤销对 Unity Catalog 中数据库对象和其他安全对象的访问权限

可以在层次结构中的任何级别授予和撤销对安全对象的访问权限,包括元存储本身。 除非撤销访问权限,否则对对象的访问会隐式授予该对象的所有子对象的相同访问权限。

可以使用典型的 ANSI SQL 命令授予和撤销对 Unity Catalog 中对象的访问权限。 例如:

GRANT CREATE TABLE ON SCHEMA mycatalog.myschema TO `finance-team`;

还可以使用 Catalog Explorer、Databricks CLI 和 REST API 来管理对象权限。

使用 Catalog Explorer 授予权限

若要了解如何在 Unity Catalog 中管理权限,请参阅在 Unity Catalog 中管理权限

Unity Catalog 中数据库对象的默认访问权限

Unity Catalog 遵循最小特权原则,用户拥有执行所需任务所需的最小访问权限。 创建工作区时,非管理员用户只能访问自动配置的工作区目录,这使得此目录成为用户尝试在 Unity Catalog 中创建和访问数据库对象过程的便捷场所。 请参阅工作区目录权限

管理员角色

默认情况下,工作区管理员和帐户管理员拥有其他权限。 元存储管理员是一个可选角色,如果你想要在元存储级别管理表和卷存储,则需要该角色,如果你想要跨区域中的多个工作区集中管理数据,使用该角色会很方便。 有关更多信息,请参阅 Unity Catalog 中的管理员权限(可选)分配元存储管理员角色

托管表/卷与外部表/卷

表和卷可以是托管的,也可以是外部的。

  • 托管表完全由 Unity Catalog 管理,这意味着 Unity Catalog 管理每个托管表的治理和底层数据文件。 托管表存储在云存储中 Unity Catalog 管理的位置。 托管表始终使用 Delta Lake 格式。 可以将托管表存储在元存储、目录或架构级别。
  • 外部表是指使用 Unity Catalog 管理其 Azure Databricks 访问权限,但使用云提供程序和其他数据平台管理其数据生命周期和文件布局的表。 通常情况下,使用外部表在 Azure Databricks 中注册大量现有数据,或者在需要使用 Azure Databricks 之外的工具对数据进行写访问时使用外部表。 外部表支持多种数据格式。 在 Unity Catalog 元存储中注册外部表后,可以管理和审核 Azure Databricks 对该的访问并使用它,就像托管表一样。
  • 托管卷完全由 Unity Catalog 管理,这意味着 Unity Catalog 管理对云提供程序帐户中卷存储位置的访问。 创建托管卷时,它会自动存储在分配给包含架构的托管存储位置中。
  • 外部卷表示在 Azure Databricks 之外管理的存储位置中,但在 Unity Catalog 中注册以控制和审核 Azure Databricks 内部的访问的现有数据。 在 Azure Databricks 中创建外部卷时,请指定其位置,该位置必须位于 Unity Catalog 外部位置中定义的路径上。

Databricks 建议使用托管表和卷来充分利用 Unity Catalog 治理功能和性能优化。

请参阅使用托管表使用外部表以及托管卷与外部卷

使用托管存储进行数据隔离

组织可能需要将特定类型的数据存储在云租户的特定帐户或存储桶中。

可通过 Unity 目录在元存储、目录或架构级别配置存储位置以满足此类要求。 系统会评估存储位置从架构到目录到元存储的层次结构。

例如,假设你的组织有一个公司合规性策略,要求与人力资源相关的生产数据驻留在容器 abfss://mycompany-hr-prod@storage-account.dfs.core.windows.net。 在 Unity 目录中,可以通过在目录级别设置位置,创建(例如名为 hr_prod 的)目录并向其分配位置 abfss://mycompany-hr-prod@storage-account.dfs.core.windows.net/unity-catalog 来实现此要求。 这意味着在 hr_prod 目录中(例如使用 CREATE TABLE hr_prod.default.table …)创建的托管表或卷会将其数据存储在 abfss://mycompany-hr-prod@storage-account.dfs.core.windows.net/unity-catalog 中。 (可选)可以选择提供架构级别位置,以更精细地组织 hr_prod catalog 内部的数据。

如果某些目录不需要存储隔离,你可以选择在元存储级别设置存储位置。 此位置将用作未分配存储的目录和架构中托管表和卷的默认位置。 但是,通常情况下,Databricks 建议为每个目录分配单独的托管存储位置。

有关更多信息,请参阅在 Unity 目录中指定托管存储位置数据在存储中以物理方式分隔

工作区-目录绑定

默认情况下,目录所有者(以及元存储管理员,如果已为帐户定义)可以使目录可供连接到同一 Unity Catalog 元存储的多个工作区中的用户访问。 但是,如果使用工作区隔离用户数据访问,则可能需要将目录访问限制到帐户中的特定工作区,以确保仅在这些工作区中处理某些类型的数据。 例如,可能需要单独的生产和开发工作区,或者需要单独的工作区来处理个人数据。 这称为工作区-目录绑定。 请参阅限制对特定工作区的目录访问

注意

为了提高数据隔离度,还可以将云存储访问绑定到特定工作区。 请参阅(可选)为特定工作区分配存储凭据(可选)为特定工作区分配外部位置

审核数据访问权限

Unity Catalog 捕获针对元存储执行的操作的审核日志,使管理员能够访问有关谁访问了给定数据集以及他们执行的操作的详细信息。

可以使用 Unity Catalog 管理的系统表访问帐户的审核日志。

请参阅审核 Unity Catalog 事件Unity Catalog 事件使用系统表监视使用情况

跟踪数据世系

可以使用 Unity Catalog,通过以任何语言对 Azure Databricks 群集或 SQL 仓库执行的查询来捕获运行时数据世系。 世系捕获级别低至列,包括与查询相关的笔记本、作业和仪表板。 若要了解详细信息,请参阅使用 Unity Catalog 捕获和查看数据世系

Lakehouse Federation 和 Unity Catalog

Lakehouse Federation 是 Azure Databricks 的查询联合平台。 术语“查询联合”是指一系列功能,它们使用户和系统能够针对多个孤立的数据源运行查询,而无需将所有数据迁移到一个统一的系统。

Azure Databricks 使用 Unity Catalog 来管理查询联合。 使用 Unity Catalog 配置与常见外部数据库系统的只读连接,并创建镜像外部数据库的外部目录。 Unity Catalog 的数据治理和数据世系工具可确保为 Azure Databricks 工作区中的用户进行的所有联合查询管理和审核数据访问。

请参阅“什么是 Lakehouse Federation?”。

Delta Sharing、Databricks 市场和 Unity Catalog

Delta Sharing 是一个安全的数据共享平台,让你可以与组织外部的用户共享数据和 AI 资产,无论这些用户是否使用 Databricks。 尽管 Delta Sharing 可用作开源实施,但在 Databricks 中,它需要 Unity Catalog 才能充分利用扩展功能。 请参阅什么是 Delta Sharing?

Databricks 市场是一个用于交换数据产品的开放论坛,它基于 Delta Sharing 构建,因此,你必须有一个支持 Unity Catalog 的工作区才能成为市场提供商。 请参阅什么是 Databricks 市场?

如何为组织设置 Unity Catalog?

若要使用 Unity Catalog,Azure Databricks 工作区必须支持 Unity Catalog,这意味着要将工作区附加到 Unity Catalog 元存储。 所有新工作区在创建时都会自动支持 Unity Catalog,但较旧的工作区可能需要帐户管理员手动启用 Unity Catalog。 无论工作区是否自动支持 Unity Catalog,都需要执行以下步骤才能开始使用 Unity Catalog:

  • 创建目录和架构以包含数据库对象(如表和卷)。
  • 创建托管存储位置以将托管表和卷存储在这些目录和架构中。
  • 授予用户对目录、架构和数据库对象的访问权限。

自动启用 Unity Catalog 的工作区会预配工作区目录,并向所有工作区用户授予广泛的权限。 可以从此目录开始,方便地试用 Unity Catalog。

有关详细设置说明,请参阅设置和管理 Unity Catalog

将现有工作区迁移到 Unity Catalog

如果你最近为一个较旧的工作区启用了 Unity Catalog,那么你可能会拥有由旧版 Hive 元存储管理的数据。 你可以将这些数据与在 Unity Catalog 中注册的数据一起使用,但旧版 Hive 元存储已被弃用,你应尽快将 Hive 元存储中的数据迁移到 Unity Catalog,以利用 Unity Catalog 的卓越治理功能和性能。

迁移涉及以下步骤:

  1. 将任何工作区本地组转换为帐户级组。 Unity Catalog 在帐户级别集中进行身份管理。
  2. 将 Hive 元存储中管理的表和视图迁移到 Unity Catalog。
  3. 更新查询和作业以引用新的 Unity Catalog 表,而不是旧的 Hive 元存储表。

以下内容有助于管理迁移:

Unity Catalog 要求和限制

Unity Catalog 需要特定类型的计算和文件格式,如下所述。 下面还列出了一些 Azure Databricks 功能,这些功能并非在所有 Databricks Runtime 版本的 Unity Catalog 中都完全受支持。

区域支持

所有区域都支持 Unity Catalog。 有关详细信息,请参阅 Azure Databricks 区域

计算要求

运行 Databricks Runtime 11.3 LTS 或更高版本的群集支持 Unity Catalog。 默认情况下,所有 SQL 仓库计算版本都支持 Unity Catalog。

在早期版本的 Databricks Runtime 上运行的群集不支持所有 Unity Catalog 正式版的功能。

若要访问 Unity Catalog 中的数据,必须为群集配置正确的访问模式。 默认情况下,Unity Catalog 是安全的。 如果群集未配置共享或单用户访问模式,则无法访问 Unity Catalog 中的数据。 请参阅访问模式

有关每个 Databricks Runtime 版本中 Unity 目录功能更改的详细信息,请参阅 发行说明

Unity Catalog 的限制因访问模式和 Databricks Runtime 版本而异。 请参阅 Unity Catalog 的计算访问模式限制

文件格式支持

Unity Catalog 支持以下表格式:

  • 托管表必须使用 delta 表格式。
  • 外部表可以使用 deltaCSVJSONavroparquetORCtext

限制

Unity Catalog 具有以下限制。 其中一些特定于较旧的 Databricks Runtime 版本和计算访问模式。

根据 Databricks Runtime 和访问模式,结构化流工作负载还存在其他限制。 请参阅 Unity Catalog 的计算访问模式限制

Databricks 发布了定期缩减此列表的新功能。

  • 以前在工作区中创建的组(即工作区级组)不能在 Unity Catalog GRANT 语句中使用。 这是为了确保跨工作区的组视图保持一致。 若要在 GRANT 语句中使用组,请在帐户级别创建组,并更新主体或组管理的任何自动化(例如 SCIM、Okta 和 Microsoft Entra ID 连接器以及 Terraform),用于引用帐户终结点,而不是工作区终结点。 请参阅帐户组和工作区本地组之间的区别

  • R 中的工作负荷不支持在运行 Databricks Runtime 15.3 及更低版本的计算上使用动态视图实现行级或列级安全性。

    对 R 中查询动态视图(公共预览版)的工作负荷使用运行 Databricks Runtime 15.4 LTS 或更高版本的单用户计算资源。 此类工作负荷还需要为无服务器计算启用的工作区。 有关详细信息,请参阅单用户计算上的精细访问控制

  • 在运行 Databricks Runtime 12.2 LTS 及更低版本的计算上,Unity Catalog 不支持浅表克隆。 可以使用浅表克隆在 Databricks Runtime 13.3 LTS 及更高版本上创建托管表。 无论 Databricks Runtime 版本如何,都无法使用它们创建外部表。 请参阅适用于 Unity Catalog 表的浅表克隆

  • Unity Catalog 表不支持 Bucket。 如果运行尝试在 Unity Catalog 中创建 Bucket 表的命令,则会引发异常。

  • 如果某些群集访问 Unity Catalog,而其他群集不访问,则从多个区域的工作区写入相同的路径或 Delta Lake 表可能会导致性能不可靠。

  • Unity Catalog 中的表不支持使用 ALTER TABLE ADD PARTITION 等命令创建的自定义分区方案。 Unity Catalog 可以访问使用目录式分区的表。

  • 仅 Delta 表支持将 DataFrame 写入 Unity Catalog 的覆盖模式,不支持其他文件格式。 用户必须对父架构拥有 CREATE 特权,并且必须是现有对象的所有者,或者对该对象拥有 MODIFY 特权。

  • Databricks Runtime 12.2 LTS 及更低版本不支持 Python UDF。 这包括 UDAF、UDTF 和 Spark 上的 Pandas(applyInPandasmapInPandas)。 Databricks Runtime 13.3 LTS 及更高版本支持 Python 标量 UDF。

  • Databricks Runtime 14.1 及更低版本在共享集群上不支持 Scala UDF。 Databricks Runtime 14.2 及更高版本在共享集群上支持 Scala 标量 UDF。

  • 不支持标准 Scala 线程池。 请改用 org.apache.spark.util.ThreadUtils 中的特殊线程池,例如 org.apache.spark.util.ThreadUtils.newDaemonFixedThreadPool。 但是,不支持 ThreadUtils 中的以下线程池:ThreadUtils.newForkJoinPool 和任何 ScheduledExecutorService 线程池。

  • 只有工作区级别的 Unity Catalog 事件支持审核日志记录。 不会记录在帐户级别发生的、不引用工作区的事件,例如创建元存储。

在 Unity Catalog 中注册的模型具有其他限制。 请参阅限制

资源配额

Unity Catalog 对所有安全对象强制实施资源配额。 如果预期超过这些资源限制,请联系 Azure Databricks 帐户团队。

下面的配额值是相对于 Unity Catalog 中的父(或祖父)级对象表示的。

对象 Parent
table schema 10000
metastore 1000000
schema 10000
metastore 100000
函数 schema 10000
已注册的模型 schema 1000
已注册的模型 metastore 5000
模型版本 已注册的模型 10000
模型版本 metastore 100000
schema 目录 10000
目录 metastore 1000
连接 metastore 1000
存储凭据 metastore 200
外部位置 metastore 10000

有关 Delta Sharing 限制,请参阅资源配额