什么是 Unity Catalog?

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

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 如何管理对云对象存储中数据和 AI 资产的访问?

Databricks 建议使用 Unity Catalog 来配置对云对象存储的所有访问。 请参阅使用 Unity Catalog 连接到云对象存储

Unity Catalog 引入了以下概念来管理 Azure Databricks 和云对象存储中数据之间的关系:

注意

通过 Lakehouse Federation 可与其他外部系统中数据集成。 云对象存储不支持这些对象。

Unity Catalog 对象模型

在 Unity Catalog 中,主要数据对象的层次结构从元存储流向表或卷:

  • 元存储:元数据的顶级容器。 每个元存储都公开了一个用于组织数据的三级命名空间 (catalog.schema.table)。
  • 目录:用于组织数据资产的对象层次结构的第一层。
  • 架构:也称为数据库,是对象层次结构的第二层,包含表和视图。
  • 表、视图和卷:数据对象层次结构中的最低层是表、视图和卷。 卷为非表数据提供治理。
  • 模型:严格地说,尽管已注册的模型不是数据资产,它们也可在 Unity Catalog 中进行管理,并驻留在对象层次结构的最低级别。

Unity Catalog 对象模型图

这是 Unity Catalog 安全对象的简化视图。 有关更多详细信息,请参阅 Unity Catalog 中的安全对象

使用三级命名空间 catalog.schema.asset 引用 Unity Catalog 中的所有数据,其中 asset 可以是表、视图、卷或模型。

元存储

元存储是 Unity Catalog 中对象的顶级容器。 它注册有关数据资产和 AI 资产的元数据,以及用于管理对资产的访问的权限。 Azure Databricks 帐户管理员应为他们的每个运营区域创建一个元存储,并将其分配到同一区域中的 Azure Databricks 工作区。 如果一个工作区想要使用 Unity Catalog,它必须附加 Unity Catalog 元存储。

可以选择将元存储配置为自己的云存储帐户中 Azure Data Lake Storage Gen2 容器或 Cloudflare R2 存储桶内的托管存储位置。 请参阅托管存储

注意

此元存储不同于 Azure Databricks 工作区中包含的 Hive 元存储,后者未为 Unity Catalog 启用。 如果工作区包含旧式 Hive 元存储,则该元存储中的数据仍可与 Unity Catalog 中名为 hive_metastore 的目录中定义的数据一起使用。 请注意,hive_metastore 目录不由 Unity Catalog 管理,并且无法受益于与 Unity Catalog 中定义的目录相同的功能集。

请参阅创建 Unity Catalog 元存储

目录

目录是 Unity Catalog 三级命名空间的第一层。 它用于组织数据资产。 用户可以查看分配了USE CATALOG数据权限的所有目录。

根据为 Unity Catalog 创建和启用工作区的方式,用户可能对自动预配的目录拥有默认权限,包括 main 目录或工作区目录 (<workspace-name>)。 有关详细信息,请参阅默认用户权限

请参阅创建和管理目录

架构

架构(又称数据库)是 Unity Catalog 三级命名空间的第二层。 架构组织表和视图。 用户可以查看他们分配有 USE SCHEMA 权限的所有架构,以及对架构的父目录分配有 USE CATALOG 权限的所有架构。 要访问或列出架构中的表或视图,用户还必须对该表或视图具有 SELECT 权限。

如果手动为你的工作区启用了 Unity Catalog,则你的工作区在 main 目录中包括一个名为 default 的默认架构,该架构可供你的工作区中的所有用户访问。 如果自动为你的工作区启用了 Unity Catalog,并且该工作区包含 <workspace-name> 目录,则该包括一个名为 default 的架构,该架构可供你的工作区中的所有用户访问。

请参阅创建和管理架构(数据库)

表位于 Unity Catalog 三级命名空间的第三层。 它包含数据行。 若要创建表,用户必须对架构具有 CREATEUSE SCHEMA 权限,并对其父目录具有 USE CATALOG 权限。 若要查询某个表,用户必须对该表拥有 SELECT 权限、对其父架构拥有 USE SCHEMA 权限,并且对其父目录拥有 USE CATALOG 权限。

表可以是托管表,也可以是外部表。

托管表

托管表是在 Unity Catalog 中创建表的默认方式。 Unity Catalog 管理这些表的生命周期和文件布局。 不应使用 Azure Databricks 以外的工具直接操作这些表中的文件。 托管表始终使用 Delta 表格式。

对于通过手动方式为 Unity Catalog 启用的工作区,托管表存储在创建元存储时配置的根存储位置。 可以选择在目录或架构级别指定托管表存储位置,替代根存储位置。

对于通过自动方式为 Unity Catalog 启用的工作区,元存储根存储位置是可选的,托管表则通常存储在目录或架构级别。

删除托管表时,将于 30 天内从云租户中删除其基础数据。

请参阅托管表

外部表

外部表是其数据生命周期和文件布局不由 Unity Catalog 管理的表。 在 Unity Catalog 中使用外部表注册大量现有数据,或者在需要使用 Azure Databricks 群集或 Databricks SQL 仓库之外的工具直接访问数据的情况下使用外部表。

删除外部表时,Unity Catalog 不会删除基础数据。 你可以管理外部表的权限,并以与托管表相同的方式在查询中使用它们。

外部表可以使用以下文件格式:

  • DELTA
  • CSV
  • JSON
  • AVRO
  • PARQUET
  • ORC
  • TEXT

请参阅外部表

视图

视图是从元存储中的一个或多个表和视图创建的只读对象。 它位于 Unity Catalog 的三级命名空间的第三层。 可以从多个架构和目录中的表和其他视图创建视图。 可以创建动态视图以启用行级和列级权限。

请参阅创建动态视图

卷位于 Unity Catalog 三级命名空间的第三层。 卷是在 Unity Catalog 中的架构下组织的表、视图和其他对象的同级对象。

卷包含以任何格式存储的数据的目录和文件。 卷提供对数据的非表格访问,这意味着卷中的文件无法注册为表。

  • 若要创建卷,用户必须对架构具有 CREATE VOLUMEUSE SCHEMA 权限,并对其父目录具有 USE CATALOG 权限。
  • 若要读取存储在卷内的文件和目录,用户必须拥有 READ VOLUME 权限、对其父架构的 USE SCHEMA 权限以及对其父目录的 USE CATALOG 权限。
  • 若要添加、移除或修改存储在卷内的文件和目录,用户必须拥有 WRITE VOLUME 权限、对其父架构的 USE SCHEMA 权限以及对其父目录的 USE CATALOG 权限。

卷可以是托管卷,也可以是外部卷。

注意

定义卷时,对卷路径下数据的云 URI 访问受卷权限约束。

托管卷

如果要预配治理位置以使用非表格文件,则托管卷是一种便捷的解决方案。

托管卷将文件存储在包含文件的架构的 Unity Catalog 默认存储位置中。 对于通过手动方式为 Unity Catalog 启用的工作区,托管卷存储在创建元存储时配置的根存储位置。 可以选择在目录或架构级别指定托管卷存储位置,从而替代根存储位置。 对于通过自动方式为 Unity Catalog 启用的工作区,元存储根存储位置是可选的,托管卷则通常存储在目录或架构级别。

以下优先级控制托管卷使用的位置:

  • 架构位置
  • 目录位置
  • Unity Catalog 元存储根存储位置

删除托管卷时,存储在该卷中的文件也会在 30 天内从云租户中删除。

请参阅什么是托管卷?

外部卷

外部卷注册到 Unity Catalog 外部位置,并提供对云存储中现有文件的访问,而无需数据迁移。 用户必须拥有外部位置的 CREATE EXTERNAL VOLUME 权限才能创建外部卷。

外部卷支持以下场景:文件由其他系统生成,并暂存以供使用对象存储从 Azure Databricks 内进行访问,或者 Azure Databricks 外部的工具需要直接文件访问。

Unity Catalog 不管理外部卷中文件的生命周期和布局。 删除外部表卷,Unity Catalog 不会删除基础数据。

请参阅什么是外部卷?

模型

模型位于 Unity Catalog 三级命名空间的第三层。 在此上下文中,“模型”是指在 MLflow 模型注册表中注册的机器学习模型。 要在 Unity Catalog 中创建模型,用户必须具有该目录或架构的 CREATE MODEL 权限。 用户还必须对其父目录具有 USE CATALOG 特权,对其父架构具有 USE SCHEMA 特权。

托管存储

你可以在 Unity Catalog 对象层次结构中的下列任一级别存储托管表和托管卷:元存储、目录或架构。 层次结构中较低级别的存储会覆盖在较高级别定义的存储。

在帐户管理员手动创建元存储时,可以选择在自己的云存储帐户中 Azure Data Lake Storage Gen2 容器或 Cloudflare R2 存储桶内分配一个存储位置,以用作托管表和卷的元存储级存储。 如果已分配元存储级托管存储位置,则目录和架构级别的托管存储位置是可选的。 也就是说,元存储级存储是可选的,Databricks 建议在目录级别分配托管存储,以便进行逻辑数据隔离。 请参阅数据治理和数据隔离构建基块

重要

如果自动为你的工作区启用了 Unity Catalog,则创建 Unity Catalog 元存储时没有元存储级托管存储。 可以选择添加元存储级存储,但 Databricks 建议在目录和架构级别分配托管存储。 有关确定是否需要元存储级存储的帮助,请参阅(可选)创建元存储级存储数据在存储中物理分隔

托管存储具有以下属性:

  • 托管表和托管卷将数据和元数据文件存储在托管存储中。
  • 托管存储位置不能与外部表或外部卷重叠。

下表介绍了如何声明托管存储并将其与 Unity Catalog 对象相关联:

关联的 Unity Catalog 对象 设置方式 与外部位置的关系
元存储 在元存储创建期间由帐户管理员配置,如果在创建时未指定存储,则在创建元存储后添加。 不能与外部位置重叠。
目录 在创建目录期间使用 MANAGED LOCATION 关键字指定。 必须包含在外部位置内。
架构 使用 MANAGED LOCATION 关键字在架构创建期间指定。 必须包含在外部位置内。

用于存储托管表和托管卷的数据和元数据的托管存储位置使用以下规则:

  • 如果包含架构具有托管位置,则数据存储在架构托管位置中。
  • 如果包含架构没有托管位置,但目录具有托管位置,则数据存储在目录托管位置中。
  • 如果包含架构和包含目录都没有托管位置,则数据存储在元存储托管位置中。

存储凭据和外部位置

为了管理对外部表、外部卷和托管存储的基础云存储的访问,Unity Catalog 使用以下对象类型:

请参阅使用 Unity Catalog 连接到云对象存储

Unity Catalog 的标识管理

Unity Catalog 使用 Azure Databricks 帐户中的标识来解析用户、服务主体和组,并强制执行权限。

若要在帐户中配置标识,请按照管理用户、服务主体和组中的说明进行操作。 在 Unity Catalog 中创建访问控制策略时,请参阅这些用户、服务主体和组。

此外,还必须将 Unity Catalog 用户、服务主体和组添加到工作区,以访问 Notebook、Databricks SQL 查询、目录资源管理器或 REST API 命令中的 Unity Catalog 数据。 将用户、服务主体和组分配到工作区称为联合身份验证。

所有附加了 Unity Catalog 元存储的工作区都启用了联合身份验证。

组的特殊注意事项

工作区中已存在的所有组在帐户控制台中都标记为“工作区(本地)”。 这些工作区本地组不能在 Unity Catalog 中用于定义访问策略。 必须使用帐户级组。 如果在命令中引用了工作区本地组,该命令将返回一个错误,指出找不到该组。 如果以前使用工作区本地组来管理对笔记本和其他项目的访问,则这些权限仍然有效。

请参阅管理组

Unity Catalog 的管理员角色

帐户管理员、元存储管理员和工作区管理员参与管理 Unity Catalog:

请参阅 Unity Catalog 中的管理员权限

Unity Catalog 中的数据权限

在 Unity Catalog 中,默认情况下数据是安全的。 最初,用户无权访问元存储中的数据。 访问权限可由元存储管理员、对象所有者或包含对象的目录或架构的所有者授予。 Unity Catalog 中的安全对象是分层的,特权是向下继承的。

你可以使用目录资源管理器、SQL 命令或 REST API 分配和撤销权限。

请参阅在 Unity Catalog 中管理权限

Unity Catalog 支持的计算和群集访问模式

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

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

若要访问 Unity Catalog 中的数据,必须为群集配置正确的访问模式。 默认情况下,Unity Catalog 是安全的。 如果群集未配置支持 Unity Catalog 的访问模式之一(即“共享”或“已分配”),则该群集将无法访问 Unity Catalog 中的数据。 请参阅访问模式

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

Unity Catalog 的限制因访问模式和 Databricks Runtime 版本而异。 请参阅 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

如何为组织设置 Unity Catalog?

若要了解如何设置 Unity Catalog,请参阅设置和管理 Unity Catalog

支持的区域

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

支持的数据文件格式

Unity Catalog 支持以下表格式:

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

Unity Catalog 限制

Unity Catalog 具有以下限制。

注意

如果群集在低于 11.3 LTS 的 Databricks Runtime 版本上运行,则可能存在此处未列出的其他限制。 Databricks Runtime 11.3 LTS 或更高版本支持 Unity Catalog。

Unity Catalog 限制因 Databricks Runtime 和访问模式而异。 结构化流式处理工作负载根据 Databricks Runtime 和访问模式具有其他限制。 请参阅 Unity Catalog 的计算访问模式限制

  • R 的工作负载不支持使用动态视图(出于行级或列级安全性考虑)。

  • 在 Databricks Runtime 13.3 LTS 及更高版本中,支持浅表克隆以从现有 Unity Catalog 托管表创建 Unity Catalog 托管表。 在 Databricks Runtime 12.2 LTS 及更低版本中,Unity Catalog 不支持浅表克隆。 请参阅适用于 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 13.3 LTS 及更高版本中,Python 标量 UDF 受支持。 在 Databricks Runtime 12.2 LTS 及更低版本中,无法使用 Python UDF,包括 Spark 上的 UDAF、UDTF 和 Pandas(applyInPandasmapInPandas)。

  • 在 Databricks Runtime 14.2 及更高版本中,Scala 标量 UDF 在共享群集上受支持。 在 Databricks Runtime 14.1 及更低版本中,并非所有 Scala 标量 UDF 在共享群集上都受支持。

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

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

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

以下限制适用于 Unity Catalog 中的所有对象名称:

  • 对象名称不能超过 255 个字符。
  • 不允许使用以下特殊字符:
    • 句点 (.)
    • 空格 ( )
    • 正斜杠 (/)
    • 所有 ASCII 控制字符(00-1F 十六进制)
    • DELETE 字符(7F 十六进制)
  • Unity Catalog 将所有对象名称存储为小写。
  • 在 SQL 中引用 UC 名称时,必须使用反引号来转义包含特殊字符的名称,例如连字符 (-)。

注意

列名称可以使用特殊字符,但如果使用了特殊字符,则必须在所有 SQL 语句中使用反引号对名称进行转义。 Unity Catalog 保留列名大小写,但对 Unity Catalog 表的查询不区分大小写。

Unity Catalog 中的模型还存在其他限制。 请参阅 Unity 目录支持的限制

资源配额

Unity Catalog 对所有安全对象强制实施资源配额。 限制在整个 Unity Catalog 中都遵循相同的分层组织。 如果预期超过这些资源限制,请联系 Azure Databricks 帐户团队。

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

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

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