Hive 元存储联合:使 Unity Catalog 能够管理 Hive 元存储中注册的表

重要

此功能目前以公共预览版提供。

本文介绍 Hive 元存储联合,此功能使 Unity Catalog 能够管理 Hive 元存储中存储的表。 可以联合外部 Hive 元存储或旧的内部 Azure Databricks Hive 元存储。

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

  • 作为 Unity Catalog 迁移路径中的一个步骤,在无需代码适应的情况下启用增量迁移,某些工作负载继续使用在 Hive 元存储中注册的数据,而另一些工作负载则会迁移。

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

  • 为组织提供一个长期混合模型,这些模型必须与在 Unity Catalog 中注册的数据一起维护 Hive 元存储中的某些数据。

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

引入 Hive 联合的示意图

Hive 元存储联合概述

在 Hive 元存储联合中,创建从 Azure Databricks 工作区到 Hive 元存储的连接,Unity Catalog 对 Hive 元存储进行爬网,以填充联合目录,使组织能够在 Unity Catalog 中使用 Hive 元存储表,提供集中访问控制、世系、搜索等。

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

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

  • Unity Catalog 检查用户是否有权访问表,并推断查询的世系。
  • 查询本身针对基础 Hive 元存储运行,利用其中存储的最新元数据和分区信息。

显示 Hive 联合应用场景中 HMS、Unity Catalog 和 Databricks 工作负载之间关系的关系图

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

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

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

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

仅联合表具有以下属性:

  • 根据抓取 Hive 元存储自动发现。 一旦在 Hive 元存储中创建表,它们就会浮出水面,并可用于在 Unity Catalog 联合目录中进行查询。
  • 允许使用 Hive 语义(如 Hive SerDes 和分区)来定义表。
  • 允许联合目录中的表与其他表有重叠路径。
  • 允许表位于 DBFS 根位置。
  • 包括 Hive 元存储中定义的视图。

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

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

  • 仅适用于 Unity Catalog 托管表的功能,例如预测优化。

  • Delta Sharing、Lakehouse 监视与联机表。

  • 某些功能存储功能,包括功能存储创建、模型服务创建、功能规格创建、模型日志记录和批量评分。

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

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

在 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 Catalog 期间,实现无缝转换的关键。 请参阅迁移到 Unity Catalog 期间,如何使用 Hive 元存储联合身份验证?

如何来设置 Hive 元存储联合?

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

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

    Hive 元存储联合使用此连接对 Hive 元存储进行抓取。 对于大多数数据库系统,你需要提供用户名和密码。 若要连接到旧的内部 Azure Databricks 工作区 Hive 元存储,Hive 元存储联合负责授权。

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

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

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

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

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

    也可使用 Unity Catalog 行和列筛选器实现精细访问控制。

  5. 开始查询数据。

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

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

有关详细说明,请参阅:

迁移到 Unity Catalog 期间,如何使用 Hive 元存储联合身份验证?

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

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

在迁移上下文中概述 HMS 联合的关系图

本部分介绍将 Azure Databricks 工作区的内部旧的 Hive 元存储迁移到 Unity Catalog 的典型工作流,其中 Hive 元存储联合可缓解转换。 它不适用于迁移外部 Hive 元存储。 外部 Hive 元存储的联合目录不支持写入。

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

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

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

注意

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

有关详细信息,请参阅为旧的工作区 Hive 元存储启用 Hive 元存储联合身份验证

步骤 2. 针对 Unity Catalog 中的联合目录运行新工作负载

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

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

在本教程中,通常执行以下步骤:

  • 选择与 Unity Catalog 兼容的计算(即单用户或共享群集访问模式、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 Catalog 外部位置)授予正确的 Unity Catalog 特权。 请参阅在 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 访问控制时,应将其关闭。

什么是授权路径?

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

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

授权路径使目录所有者能够对用户可使用联合身份验证访问的数据设置防护栏,从而为联合目录增加了一层额外的安全性。 如果 Hive 元存储允许用户更新元数据和任意更改表的位置(否则这些更新都会同步到联合目录中),这就非常有用。 在此应用场景中,用户有可能重新定义他们已有权访问的表,使其指向他们本来无权访问的新位置。

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

UCX 是用于将 Azure Databricks 工作区迁移到 Unity Catalog 的 Databricks Labs 项目,其中包括用于启用 Hive 元存储联盟的实用程序:

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

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

要求、支持的功能和限制

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

类别 支持 不支持
元存储 - 旧工作区 Hive 元存储(Databricks 内部)
- 在 Apache Hive 版本 0.13 或 2.3 上,使用 mySQL 的外部元存储
- 在 mySQL 以外的数据库中的外部元存储
- Hive 3.1
Operations - 内部 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 Catalog 功能 - Unity Catalog 特权模型
- 行筛选器和列掩码
- 审核
- 下游世系
- 跨工作区访问(DBFS 根和装载除外)
- 仅限于定义的外部位置的数据访问
- Delta Sharing
- Lakehouse 监视
- 矢量搜索
- 在线表
- 某些功能存储功能,包括功能存储创建、模型服务创建、功能规格创建、模型日志记录和批量评分
- 不能将增量实时表具体化视图和流式处理表写入联合目录,但可以将联合资产用作增量实时表具体化视图及流式处理表的源。
- 自动将旧表 ACL 迁移到联合目录的 Unity Catalog 特权。 UCX 可帮助解决此问题。