Hive 元存储联合:启用 Unity Catalog 来管理 Hive 元存储中注册的表

重要

此功能为公共预览版

本文介绍 Hive 元存储联邦,这一功能使 Unity Catalog 能够监管存储在 Hive 元存储中的表。 可以联合外部 Hive 元存储或旧版内部 Azure Databricks Hive 元存储。

Hive 元存储联合可用于以下用例:

  • 作为 Unity Catalog 迁移路径中的一个步骤,无需代码调整即可启用增量迁移,部分工作负载继续使用在 Hive 元存储中注册的数据,而其他工作负载则逐步迁移。

    此用例最适用于当今使用旧式 Azure Databricks Hive 元存储的组织,因为联合内部 Hive 元存储允许读取和写入工作负荷。

  • 为必须维护 Hive 元存储中的某些数据以及 Unity Catalog 中注册的数据的组织提供长期混合模型。

    此用例最适用于使用外部 Hive 元存储的组织,因为这些 Hive 元存储的联合目录是只读的。

引入 Hive 联合 的 关系图

Hive 元存储联合概述

在 Hive 元存储联盟中,您可以创建一个从 Azure Databricks 工作区到 Hive 元存储的连接,Unity Catalog 会扫描 Hive 元存储以填充 联合目录,使您的组织能够在 Unity Catalog 中使用 Hive 元存储表,从而提供集中的访问控制、数据流向、搜索等功能。

Azure Databricks 工作区外部的联合 Hive 元存储允许使用 Unity Catalog 进行读取。 内部 Hive 元存储允许读取和写入,在写入时更新 Hive 元存储元数据以及 Unity 目录元数据。

查询联合 Hive 元存储资产时,Unity 目录提供治理层,执行访问控制检查和审核等功能,同时使用 Hive 元存储语义执行查询。 例如,如果用户查询在联合目录中以 Parquet 格式存储的表,则:

  • Unity 目录检查用户是否有权访问表,并推断查询的世系。
  • 查询本身在 Hive 元存储上运行,利用存储在那里的最新元数据和分区信息。

关系图,显示 Hive 联合方案中 HMS、Unity 目录和 Databricks 工作负荷之间的关系

Hive 元存储联合与使用 Unity Catalog 外部表相比如何?

Unity 目录能够创建 外部表,获取任意云存储位置中已存在的数据,并将其注册到 Unity 目录中作为表。 本部分探讨外部和联合 Hive 元数据存储表之间的差异。

这两种表类型具有以下属性:

  • 可用于将云存储中的任意位置注册为表。
  • 可以应用 Unity 目录权限和精细的访问控制。
  • 可以在世系中查看引用它们的查询。

只有联合表具有以下属性:

  • 在爬网 Hive 元存储时被自动发现。 一旦表在 Hive 元存储中创建,它们就会在 Unity Catalog 联合目录中显示并可以查询。
  • 允许使用 Hive 语义(如 Hive SerDes 和分区)定义表。
  • 允许表具有与联合目录中其他表重叠的路径。
  • 允许表位于 DBFS 根目录 位置。
  • 包括 Hive 元存储中定义的视图。

这样,就可以视为联合 Hive 元存储表向后兼容 Hive 元存储,从而允许工作负载使用仅限 Hive 的语义,但具有 Unity Catalog 提供的治理。

但是,某些 Unity 目录功能在联合表中不可用,例如:

  • 仅适用于 Unity Catalog 托管表的功能,例如预测优化。
  • 矢量搜索、Delta Sharing、Lakehouse Monitoring 和在线表。
  • 某些功能存储功能,包括功能存储创建、模型服务创建、功能规格创建、模型日志记录和批量评分。

性能可能略低于 Unity 目录或 Hive 元存储上的工作负荷,因为 Hive 元存储和 Unity 目录都位于联合表的查询路径上。

有关支持的功能的详细信息,请参阅 要求、支持的功能和限制

在 Azure Databricks 中,写入联合 Hive 元存储目录意味着什么?

仅联合的内部 Hive 元存储(而不是外部 Hive 元存储)支持写入。

对联合元存储的写入分为两种类型:

  • DDL 操作,例如 CREATE TABLEALTER TABLEDROP TABLE

    DDL 操作在底层 Hive 元存储中同步反映。 例如,运行 CREATE TABLE 语句会在 Hive 元存储和联合目录中创建表。

    警告

    这也意味着 DROP 命令反映在 Hive 元存储中。 例如,DROP SCHEMA mySchema CASCADE 删除基础 Hive 元存储架构中的所有表,而不选择 UNDROP,因为 Hive 元存储不支持 UNDROP

  • DML 操作,如 INSERTUPDATEDELETE

    DML 操作也会同步反映在基础 Hive 元存储表中。 例如,运行 INSERT INTO 将记录添加到 Hive 元存储中的表。

    写入支持是在从 Hive 元存储迁移到 Unity 目录期间实现无缝转换的关键。 请参阅如何在迁移到 Unity Catalog 的过程中使用 Hive 元存储联合?

如何设置 Hive 元存储联合?

若要设置 Hive 元存储联合,请执行以下操作:

  1. 在 Unity Catalog 中创建 连接,指定用于访问 Hive 元数据存储的路径和凭据。

    Hive 元存储联合使用此连接爬网 Hive 元存储。 对于大多数数据库系统,你提供用户名和密码。 对于连接到旧版内部 Azure Databricks 工作区 Hive 元存储,Hive 元存储联合会负责授权。

  2. 在 Unity Catalog 中为 Hive 元存储中注册的表的路径创建“存储凭据”和“外部位置”

    外部位置包括路径以及访问这些路径所需的“存储凭据”。 存储凭据是 Unity 目录安全对象,用于指定用于访问云存储的凭据,例如 Azure 托管标识。 根据为创建外部位置选择的工作流,在创建外部位置之前,可能需要创建存储凭据。

  3. 使用在步骤 1 中创建的连接在 Unity 目录中创建 联合目录

    这是工作区用户和工作流用于使用 Unity Catalog 处理 Hive 元存储表的目录。 创建联合目录后,Unity Catalog 会用 Hive 元存储中已注册的表格填充它。

  4. 使用 Unity Catalog 向联合目录中的表授予权限。

    还可以使用 Unity 目录行和列筛选器进行精细的访问控制。

  5. 开始查询数据。

    使用 Unity Catalog 访问联合数据对于外部 Hive 元存储是只读的,对于内部 Hive 元存储是可读写的。

    对于内部和外部 Hive 元存储,Unity Catalog 会随着表元数据在 Hive 元存储中发生变化来持续更新表元数据。 对于内部 Hive 元存储,从联合目录提交的新表和表更新将写回到 Hive 元存储,从而保持 Unity Catalog 和 Hive 元存储目录之间的完全互操作性。

有关详细说明,请参阅:

在迁移到 Unity Catalog 的过程中,如何使用 Hive 元存储联合功能?

通过 Hive 元存储联合,你可以通过减少团队和工作负载之间的协作需求来以渐进方式迁移到 Unity Catalog。 特别是,如果要从 Azure Databricks 工作区的内部 Hive 元存储进行迁移,则能够读取和写入 Hive 元存储和 Unity 目录元存储意味着可以在迁移期间维护“镜像”元存储,从而提供以下优势:

  • 针对联合目录运行的工作负载在 Hive 元存储兼容模式下运行,可减少迁移期间代码适应的成本。
  • 每个工作负荷都可以选择独立于其他人迁移,因为知道,在迁移期间,数据将在 Hive 元存储和 Unity 目录中都可用,从而缓解了在相互依赖的工作负载之间协调的需求。

示意图提供了迁移上下文中 HMS 联合的概述

本部分介绍将 Azure Databricks 工作区的内部旧 Hive 元存储迁移到 Unity Catalog 的典型工作流,其中通过 Hive 元存储联邦来简化过渡过程。 它不适用于迁移外部 Hive 元存储。 外部 Hive 元存储的联合目录不支持写入。

步骤 1:联合内部 Hive 元存储

在此步骤中,将创建一个联合目录,用于在 Unity Catalog 中镜像你的 Hive 元存储。 让我们称它为 hms_in_uc

关系图显示了 Hive 元存储上运行的工作负载以及镜像的 Unity Catalog联合目录 hms_in_uc 的存在情况

注意

在联合过程中,设置外部位置以提供对云存储中的数据的访问权限。 在迁移方案中,某些工作负荷使用旧访问机制查询数据,而其他工作负荷正在 Unity 目录中查询相同的数据,外部位置上的 Unity 目录管理的访问控制可以防止旧工作负载从启用了 Unity 目录的计算访问存储的路径。 可以在这些外部位置上启用“回退模式”,以回退到为旧版工作负载定义的任何群集或笔记本范围的凭据。 然后,完成迁移后,请关闭回退模式。 请参阅 什么是回退模式?

有关详细信息,请参阅为旧版工作区 Hive 元存储启用 Hive 元存储联合

步骤 2. 在 Unity Catalog 中的联邦目录上运行新的工作负载。

建立联合目录后,可以授予 SQL 分析师和数据科学使用者访问权限,并开始开发指向该目录的新工作负载。 新的工作负载受益于 Unity 目录中的其他功能集,包括访问控制、搜索和世系。

关系图显示了 Hive 元存储上运行的现有工作负载,以及镜像的 Unity Catalog 联合目录 hms_in_uc 上运行的新工作负载

在此步骤中,通常执行以下操作:

  • 选择与 Unity 目录兼容的计算(即单用户或共享群集访问模式、SQL 仓库或无服务器计算)。 请参阅 要求、支持的功能和限制
  • 将联合目录设置为计算资源上的 默认目录,或将 USE CATALOG hms_in_uc 添加到代码顶部。 由于联合目录中的架构和表名称是 Hive 元存储中的架构和表名称的确切镜像,因此代码将开始引用联合目录。

步骤 3. 迁移现有作业以针对联合目录运行

若要迁移现有作业以查询联合目录,请执行以下操作:

  1. 通过设置群集本身的属性或在代码顶部添加 USE CATALOG hms_in_uc,将作业群集上的默认目录更改为 hms_in_uc
  2. 将作业切换到单用户或共享访问模式计算,并升级到支持 Hive 元存储联合的 Databricks Runtime 版本之一。 请参阅 要求、支持的功能和限制
  3. 要求 Azure Databricks 管理员对 hms_in_uc 中的数据对象以及作业访问的任何云存储路径(这些路径包含在 Unity 编目外部位置中)授予正确的 Unity 目录权限。 请参阅在 Unity Catalog 中管理权限

提供了迁移上下文中 HMS 联合的概述的第二张示意图

步骤 4. 拒绝访问 Hive 元存储

将所有工作负载迁移到查询联合目录后,不再需要 Hive 元存储。 可以使用旧表访问控制和计算权限阻止从 Azure Databricks 工作区直接访问 Hive 元存储。 例如,可以:

  1. 撤销对 Hive 元存储目录中的对象的所有权限。

    为此,MSCK REPAIR PRIVILEGES 命令十分方便。 请参阅 MSCK REPAIR PRIVILEGESHive 元存储特权和安全对象(旧版)

  2. 阻止用户使用计算策略创建和使用绕过表访问控制的群集(不使用隔离共享访问模式的群集或旧的自定义群集类型)。

    请参阅 管理计算配置

  3. 将联合目录设为工作区默认目录。

    请参阅 管理默认目录

常见问题解答

以下部分提供有关 Hive 元存储联合的更多详细信息。

什么是回退模式?

“回退模式”是外部位置的设置,可用于在迁移到 Unity Catalog 期间绕过 Unity Catalog 权限检查。 设置可确保尚未迁移的工作负荷在安装阶段不会受到影响。

Unity Catalog 使用外部位置获取访问云存储的权限,这些位置是定义路径和凭据以访问云存储帐户的可安全对象。 你可以对其发出权限,例如 READ FILES,以控制谁可以使用路径。 迁移过程中的一个挑战是,你可能不希望 Unity Catalog 立即开始控制对路径的所有访问,例如,当你有现有的工作负载引用了这些路径但尚未迁移时。

回退模式允许您延迟严格执行 Unity Catalog 对外部位置的访问控制。 启用回退模式后,系统首先根据 Unity Catalog 权限检查访问路径的工作负载,如果失败,则回退到使用群集或笔记本范围的凭据,例如实例配置文件或 Apache Spark 配置属性。 这样,现有工作负载就可以继续使用其当前凭据。

回退模式仅用于迁移期间使用。 迁移所有工作负载后,并且准备好强制实施 Unity Catalog 访问控制时,应将其关闭。

回退使用的查询审核日志

使用以下查询检查过去 30 天内是否有任何访问外部位置使用了备用模式。 如果帐户中没有回退模式访问,Databricks 建议关闭回退模式。

SELECT event_time, user_identity, action_name, request_params, response, identity_metadata
FROM system.access.audit
WHERE
request_params.fallback_enabled = 'true' AND
request_params.path LIKE '%some-path%' AND
event_time >= current_date() - INTERVAL 30 DAYS
LIMIT 10

什么是授权路径?

创建联合目录时,系统会提示向存储 Hive 元存储表的云存储提供“授权路径”。 要使用 Hive 元存储联合访问的任何表都必须包含在这些路径内。 Databricks 建议授权路径是大量表中常见的子路径。 例如,如果表位于 abfss://container@storageaccount.dfs.core.windows.net/bucket/table1./bucket/table2./bucket/table3,则应提供 abfss://container@storageaccount.dfs.core.windows.net/bucket/ 作为授权路径。

可以使用 UCX 来帮助标识在 Hive 元存储中存在的路径。

授权路径使目录所有者能够向用户可使用联合访问的数据应用防护措施,从而在联合目录中添加额外的安全层。 如果你的 Hive 元存储允许用户更新元数据以及任意更改表位置,这非常有用,否则这些更新将同步到联合目录中。 在此方案中,用户可以重新定义他们已有权访问的表,以便他们指向他们本来无权访问的新位置。

是否可以使用 UCX 联合 Hive 元存储?

UCX 是用于将 Azure Databricks 工作区迁移到 Unity Catalog 的 Databricks Labs 项目,包含用于启用 Hive 元存储联合的实用工具:

  • enable-hms-federation
  • create-federated-catalog

请参阅 GitHub中的 项目自述文件。 有关 UCX 的简介,请参阅 使用 UCX 实用工具将工作区升级到 Unity 目录

要求、支持的功能和限制

下表列出了 Hive 元存储联合支持的服务和功能。 在某些情况下,还会列出不支持的服务或功能。 在这些表中,“HMS”代表 Hive 元存储。

类别 支持 不支持
元存储 - 旧版工作区 Hive 元存储(Databricks 内部)
- 在 Apache Hive 版本 0.13 或 2.3 上使用 mySQL 的外部元存储
- 除 mySQL 以外的数据库中的外部元存储
- Hive 3.1
操作 - 内部 Databricks HMS:读取和写入
- 外部 HMS:只读
Hive 元存储数据资产 - Hive 元存储中的托管表和外部表
-模式
- 浏览量
- Hive SerDe 表
- Hive 函数和 UDF
- 在联合目录中定义新浅表克隆
- JDBC 支持的表
- Delta Sharing 共享表
通过联合目录访问 Hive 元存储中注册的浅层克隆
存储 - Azure Data Lake Storage Gen2
- 引用 DBFS 装载位置的表,包括 DBFS 根
- 路径与外部位置中定义的其他 HMS 表路径重叠的表
- 路径与原生 Unity Catalog 对象路径重叠的 HMS 表
- 访问在外部 HMS 中注册的 DBFS 根或装载位置中的表
- 从除定义内部 HMS 所在工作区外的任何其他工作区访问 DBFS 根目录或挂载位置中的表。
- 对工作区存储帐户的防火墙支持
计算类型 - 共享群集
- 单用户(已分配)群集
- 无服务器(全部)
- SQL 仓库(全部)
无隔离群集
计算版本 - 所有 Databricks SQL 通道
- 所有增量实时表通道
- Databricks Runtime 13.3 LTS
- Databricks Runtime 14.3 LTS
- Databricks Runtime 15.1 及更高版本
Unity 目录功能 - Unity Catalog 权限模型
- 行筛选器和列掩码
-审计
- 下游世系
- 表搜索
- 跨工作区访问(DBFS 根和装载除外)
- 数据访问仅限于指定的外部位置
- Delta共享
- Lakehouse Monitoring
- 矢量搜索
- 在线表
- 某些功能存储功能,包括功能存储创建、模型服务创建、功能规格创建、模型日志记录和批量评分
- 不能将 Delta Live Tables 增量实时表具体化视图和流式表写入联合目录,但可以将联合资产用作 Delta Live Tables 增量实时表具体化视图和流式表的源。
- 将旧版表 ACL 自动迁移至联合目录的 Unity Catalog 特权。 UCX 可以帮助解决此问题。