将旧版 Hive 元存储与 Unity Catalog 结合使用

本文介绍如何在启用了 Unity Catalog 的 Azure Databricks 工作区中继续使用旧版每工作区 Hive 元存储。

如果工作区在启用 Unity Catalog 之前就已经投入使用,则可能会有一个 Hive 元存储,其中包含你可能希望继续使用的数据。 本文介绍如何继续使用在 Hive 元存储中注册的表。

重要

每个工作区的 Hive 元数据存储是一个遗留功能,本文中所提供的说明代表遗留工作流程。

Hive 元存储中的表无法享有 Unity Catalog 提供的一整套安全和治理功能,例如内置审核、世系和访问控制。 Databricks 建议将这些表及引用它们的工作负载迁移到 Unity Catalog,并禁用对 Hive 元存储的直接访问。

有两个迁移路径可用:

  • 将 Hive 元存储中注册的所有表迁移到 Unity Catalog。

  • 请使用 Hive 元存储联合功能,将 Hive 元存储逐步迁移到 Unity Catalog,以实现更平稳地迁移。 Hive 元存储联合功能会在 Unity Catalog 中创建一个外部目录,用于镜像 Hive 元存储。

请参阅 将 Azure Databricks 工作区升级到 Unity 目录

在 Unity Catalog 中查询旧版 Hive 元存储

Unity Catalog 元存储是累加性的,这意味着它可以与 Azure Databricks 中的每工作区 Hive 元存储一起使用。 Hive 元存储在三级命名空间中显示为名为 hive_metastore 的顶级目录。

例如,可使用以下表示法引用旧式 Hive 元存储的 sales_raw 架构中名为 sales 的表:

SQL

SELECT * from hive_metastore.sales.sales_raw;

Python

display(spark.table("hive_metastore.sales.sales_raw"))

R

library(SparkR)

display(tableToDF("hive_metastore.sales.sales_raw"))

Scala(编程语言)

display(spark.table("hive_metastore.sales.sales_raw"))

还可使用 USE 语句指定目录和架构:

SQL

USE hive_metastore.sales;
SELECT * from sales_raw;

Python

spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))

R

library(SparkR)

sql("USE hive_metastore.sales")
display(tableToDF("sales_raw"))

Scala(编程语言)

spark.sql("USE hive_metastore.sales")
display(spark.table("sales_raw"))

与旧版 Hive 元存储相比,Unity Catalog 中的访问控制

如果在 Hive 元存储上配置 了旧表访问控制 ,Databricks 将继续对在标准访问模式下运行的群集的 hive_metastore 目录中的数据强制实施这些访问控制。

Unity 目录访问模型与旧式访问控制略有不同:

  • 元存储:Unity 目录是帐户级对象,Hive 元存储是工作区级对象。 在 hive_metastore 目录中定义的权限始终指向工作区中的本地用户和组。
  • 帐户组:Unity Catalog 中的访问控制策略将应用于帐户组,而 Hive 元存储的访问控制策略将应用于工作区本地组。 请参阅 组源
  • 对目录或架构内对象的所有操作都需要对该目录和架构拥有 USE CATALOGUSE SCHEMA 权限:无论主体对表的特权如何,主体还必须对其父目录拥有 特权才能访问架构,并且必须拥有 USE CATALOG 特权才能访问架构中的对象。 另一方面,使用工作区级别的表访问控制时,授予对根目录的 USAGE 会自动授予对所有数据库的 USAGE,但对根目录的 USAGE 不是必需的。
  • 视图:在 Unity Catalog 中,视图的所有者无需是视图所引用的表和视图的所有者。 拥有 SELECT 特权,同时对视图的父架构拥有 USE SCHEMA 特权并对父目录拥有 USE CATALOG 特权便已足够。 使用工作区级别的表访问控制时,视图的所有者需要是所有引用的表和视图的所有者。
  • 不支持 ANY FILEANONYMOUS FUNCTION:在 Unity Catalog 中,不存在可能允许非特权用户运行特权代码的 ANY FILEANONYMOUS FUNCTION 安全对象概念。
  • DENY不支持 :Unity Catalog 特权模型基于最小特权原则构建。 系统默认拒绝未授予的特权。
  • READ_METADATA 特权:Unity Catalog 以另一方式管理查看元数据所需的访问权限。 请参阅 Unity Catalog 特权和安全对象

Unity Catalog 对象与 Hive 元存储对象之间的联接

使用三级命名空间表示法,可以联接 Unity Catalog 元存储中的数据和旧式 Hive 元存储中的数据。

注意

与旧式 Hive 元存储区中的数据的联接将仅在该数据所在的工作区上有效。 尝试在另一个工作区中运行此类联接会导致错误。 Azure Databricks 建议将旧式表和视图升级到 Unity Catalog。

sales_current 字段相等时,以下示例将旧式 Hive 元存储中的 sales_historical 表的结果与 Unity Catalog 元存储中的 order_id 表的结果联接。

SQL

SELECT * FROM hive_metastore.sales.sales_current
JOIN main.shared_sales.sales_historical
ON hive_metastore.sales.sales_current.order_id = main.shared_sales.sales_historical.order_id;

Python

dfCurrent = spark.table("hive_metastore.sales.sales_current")
dfHistorical = spark.table("main.shared_sales.sales_historical")

display(dfCurrent.join(
  other = dfHistorical,
  on = dfCurrent.order_id == dfHistorical.order_id
))

R

library(SparkR)

dfCurrent = tableToDF("hive_metastore.sales.sales_current")
dfHistorical = tableToDF("main.shared_sales.sales_historical")

display(join(
  x = dfCurrent,
  y = dfHistorical,
  joinExpr = dfCurrent$order_id == dfHistorical$order_id))

Scala(编程语言)

val dfCurrent = spark.table("hive_metastore.sales.sales_current")
val dfHistorical = spark.table("main.shared_sales.sales_historical")

display(dfCurrent.join(
  right = dfHistorical,
  joinExprs = dfCurrent("order_id") === dfHistorical("order_id")
))

默认目录

为为 Unity Catalog 启用的每个工作区配置默认目录。

如果在执行数据操作时省略顶级目录名称,则会采用默认目录。

最初为工作区配置的默认目录取决于为 Unity Catalog 启用工作区时的方式:

  • 如果工作区是自动启用 Unity Catalog 的,工作区目录便被设置为默认目录。 请参阅自动启用 Unity Catalog
  • 如果是手动为 Unity Catalog 启用工作区,则将 hive_metastore 目录设置为默认目录。

如果要在现有工作区中从 Hive 元存储转换到 Unity Catalog,则有必要使用 hive_metastore 作为默认目录,以避免影响引用了 hive 元存储的已有代码,除非你已从 Hive 元存储中完全迁移出。

若要了解如何获取和切换默认目录,请参阅管理默认目录

以群集为作用域的数据访问权限

将 Hive 元存储与 Unity Catalog 一起使用时,与群集关联的数据访问凭据用于访问 Hive 元存储数据,但不用于访问在 Unity Catalog 中注册的数据。

如果用户访问 Unity Catalog 外部的路径(例如未注册为表或外部位置的路径),则使用为群集分配的访问凭据。

请参阅连接到 Azure Data Lake Storage 和 Blob 存储

Hive 元存储数据库连接限制

Azure Databricks 托管的旧版 Hive 元存储具有资源限制,以确保可靠性,包括并发(活动)连接的限制和每小时连接数的限制。 如果工作负荷超出这些限制,群集和作业可能会遇到元存储连接错误或无法启动。

为了避免触及以下限制:

  • 迁移到 Unity 目录:最有效的方法是升级表并 禁用对 Hive 元存储的直接访问。 Unity 目录不使用旧的 Hive 元存储,因此 Hive 元存储特定的数据库连接限制不再适用。 请参阅 将 Azure Databricks 工作区升级到 Unity 目录
  • 优化工作负载编排以缓解峰值并发问题:避免同步作业和集群启动、限制突发性扇出操作,并尽量减少导致连接限制突破可能性的瞬时 Hive 元存储活动峰值。

迁移后禁用 Hive Metastore 访问

将表迁移到 Unity 目录后,Databricks 建议显式禁用对 Hive 元存储的直接访问。 默认情况下,除非显式禁用 Hive 元存储访问,否则 Azure Databricks 计算群集即使在迁移后仍会继续连接到 Hive 元存储。

可以跨整个工作区或每个计算群集单独禁用对 Hive 元存储的直接访问。 请参阅 “禁用对 Azure Databricks 工作区使用的 Hive 元存储的访问”。