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 Catalog 提供治理层,执行访问控制检查和审核等功能,同时使用 Hive 元存储语义执行查询。 例如,如果用户查询在外部目录中以 Parquet 格式存储的表,则:

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

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

与使用 Unity Catalog 外部表相比,Hive 元存储联合有何不同?

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

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

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

联合 Hive 元存储中的外表具有以下属性:

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

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

但是,某些 Unity 目录功能在外部表上不可用,例如:

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

性能可能会稍微逊色于 Unity Catalog 或 Hive Metastore 上的工作负载,因为 Hive Metastore 和 Unity Catalog 都位于外部表的查询路径中。

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

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

关系图的第二个实例,概述了迁移上下文中的 HMS 联合

步骤 4. 禁用对 Hive 元存储的直接访问

迁移所有工作负载以查询外部目录后,不再需要 Hive 元存储。

  1. 禁用对 Hive 元存储的直接访问。

    请参阅 “禁用对 Azure Databricks 工作区使用的 Hive 元存储的访问”。

  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 元存储表的云存储的授权路径。 这些路径必须涵盖要使用 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 元存储联合支持的外部目录上添加一层额外保护。 它们使目录所有者能够将防护措施应用于用户可以使用联合访问的数据。 如果 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 和 3.1 上的外部元存储
  • MySQL、SQL Server 或 Postgres
操作
  • 内部 Databricks HMS:读取和写入
    支持 OPTIMIZEVACUUMANALYZE TABLE
  • 外部 HMS:只读
    支持 OPTIMIZEVACUUM。 不支持 ANALYZE TABLE
Hive 元存储数据资产
  • Hive 元存储中的托管表和外部表
    这包括外部表的文件格式中列出的所有数据格式的表,并且还新增了 Iceberg 表(仅位于联合外部 Hive 元存储中)。 Iceberg 支持目前提供公共预览版。 请参阅 Iceberg 表限制
  • 模式
  • 浏览量
  • Hive SerDe 表
  • 通过外部目录访问 Hive 元存储中注册的浅表克隆(公共预览版)。 请参阅使用浅表克隆
  • 在外部目录中定义新的浅表克隆(公共预览版)
  • Hive 函数和 UDF
  • JDBC 支持的表
  • Delta Sharing 共享的表
存储
  • 其路径与本机 Unity Catalog 对象路径重叠的 HMS 表
  • 访问 DBFS 根目录或在外部 HMS 中注册的装载位置中的表
  • 从定义内部 HMS 的工作区以外的任何工作区访问 DBFS 根目录或装载位置中的表
计算类型
  • 标准访问模式计算(以前共享访问模式)
  • 专用访问模式计算(以前是单用户访问模式)
  • 无服务器(全部)
  • SQL 仓库(全部)
  • Databricks 容器服务(DCS):需要在 Spark 配置中设置spark.databricks.unityCatalog.hms.federation.enabled true
无隔离群集
计算版本
  • 所有 Databricks SQL 通道
  • 所有 Lakeflow 声明性管道渠道
  • Databricks Runtime 13.3 LTS
  • Databricks Runtime 14.3 LTS
  • Databricks Runtime 15.1 及更高版本
  • 用于提供 Iceberg 支持的 Databricks Runtime 16.2 及更高版本(公共预览版)
Unity 目录功能
  • Unity Catalog 特权模型
  • 行筛选器和列掩码
  • 审计
  • 下游世系
  • 表搜索
  • 跨工作区访问(DBFS 根和装载除外)
  • 数据访问仅限于指定的外部位置
  • Delta共享
  • 湖屋监控
  • 矢量搜索
  • 在线表格
  • 某些功能存储功能,包括功能存储创建、模型服务创建、功能规格创建、模型日志记录和批量评分
  • 不能将 Lakeflow 声明性管道的物化视图和流表写入外部目录,但可以将外部表和视图用作 Lakeflow 声明性管道的物化视图和流表的源。
  • 自动将联合目录的旧表 ACL 迁移到 Unity Catalog 特权。 UCX 可以帮助解决此问题。

使用浅表克隆

重要

浅表克隆支持目前为公共预览版

Hive 元存储联合支持从 Hive 元存储中注册的表创建浅表克隆,注意事项如下:

  • 从 Hive 元存储联合目录读取浅表克隆时,克隆具有 DEGRADED 预配状态。 这表示浅表克隆使用 Hive 权限模型,该模型要求从浅表克隆表读取的用户对浅表克隆和基表具有 SELECT 特权。

    若要将浅表克隆升级为与 Unity 目录权限模型一致,表所有者必须运行 REPAIR TABLE <table> SYNC METADATA。 运行命令后,表的预配状态更改为 ACTIVE,然后权限由 Unity Catalog 控制。 只要命令在支持 Unity Catalog 的计算资源上运行,对浅表克隆的后续读取操作仅需浅表克隆本身的 SELECT 权限。

  • 不支持在 DBFS 中创建或基于在 DBFS 中装载的表创建的浅表克隆。