为旧工作区 Hive 元存储启用 Hive 元存储联合

本文介绍如何联合旧的 Azure Databricks Hive 元存储,让你的组织可以利用 Unity Catalog 搭配使用 Hive 元存储表。

有关 Hive 元存储联合的概述,请参阅 Hive 元存储联合:启用 Unity Catalog 来管理 Hive 元存储中注册的表。

在您开始之前

查看 Hive 元存储联合支持的服务和功能列表:要求、支持的功能和限制

下文列出了每个步骤的具体要求。

步骤 1:将 Unity Catalog 连接到 Hive 元存储

在此步骤中,你将创建作为 Unity Catalog 安全对象的一个连接,该对象指定用于访问数据库系统(本例中为 Azure Databricks 工作区的传统 Hive 元存储)的路径和凭证。

要求

  • Unity Catalog 元存储上的 CREATE CONNECTION 特权。

创建连接

连接指定用于访问外部数据库系统的路径和凭据。 若要创建连接,可以使用目录资源管理器,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE CONNECTION SQL 命令。

注释

你还可以使用 Databricks REST API 或 Databricks CLI 来创建连接。 请参阅 POST /api/2.1/unity-catalog/connectionsUnity Catalog 命令

配置与旧 Azure Databricks Hive 元存储的连接时,请在 API 请求中包含该选项 "builtin": "true"

所需的权限:具有 CREATE CONNECTION 特权的元存储管理员或用户。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录

  2. 在“快速访问”页面上,单击“添加数据 > 添加连接”

  3. 在“设置连接”向导的“连接基本信息”页上,输入一个用户友好的“连接名称”

  4. 选择连接类型Hive 元存储元存储类型内部

  5. (可选)添加注释。

  6. 单击 “下一步”

  7. (可选)在“连接详细信息”页面上,输入到 Hive 仓库目录的完全限定路径。

    只有在不想使用默认位置时,才需要此项。

  8. 单击“ 创建连接”。

  9. “目录基本信息 ”页上,输入外国目录的名称。

  10. 对于 授权路径,请选择可通过目录访问的云存储路径。 只有属于这些路径的表才能通过联合目录查询。 路径必须由外部位置覆盖。 有关详细信息,请参阅 什么是授权路径?

  11. 单击“创建目录”。

  12. “访问 ”页上,选择用户可以在其中访问所创建的目录的工作区。 您可以选择所有工作区均具有访问权限,或单击分配到工作区,选择工作区,然后单击分配

  13. 添加一个所有者,该 所有者 将能够管理对目录中所有对象的访问。 开始在文本框中键入用户或组,然后单击返回的结果中的用户或组。

  14. 授予对目录的“特权”

    1. 单击授权
    2. 指定将有权访问目录中对象的 主体 。 开始在文本框中键入用户或组,然后单击返回的结果中的用户或组。
    3. 选择每个用户或组要授予的Privilege 预设。 默认情况下,向所有帐户用户授予 BROWSE
      • 从下拉菜单中选择 “数据读取者 ”,以授予 read 对目录中对象的权限。
      • 从下拉菜单中选择 “数据编辑器”,以向 readmodify 授予目录中对象的权限。
      • 手动选择要授予的权限。
    4. 单击授权
  15. 单击 “下一步”

  16. “元数据 ”页上,可以选择将标记指定为键值对。 有关详细信息,请参阅 将标记应用于 Unity 目录安全对象

  17. (可选)添加注释。

  18. 单击“ 保存”。

SQL

在笔记本或 SQL 查询编辑器中运行以下命令。

CREATE CONNECTION IF NOT EXISTS <connection-name> TYPE hive_metastore
  OPTIONS (
    builtin true,
    warehouse_directory '/path/to/warehouse-directory' );

只有当你不想为集群配置中的 Hive 元存储使用默认的 Hive 仓库目录位置时,才包含 warehouse_directory。 从联合目录创建托管表或架构时,此路径用于确定托管表或架构的具体位置。

步骤 2:在内部旧的 Hive 元存储中为数据创建外部位置

在此步骤中,您将在 Unity Catalog 中配置一个外部存储位置,以管理对云端存储位置的访问,这些云端存储位置保存了您旧有的内部 Hive 元数据存储库中注册的数据。

外部位置是将存储凭证与云存储容器路径相关联的 Unity Catalog 安全对象。 请参阅 存储凭据和外部位置

要求

有关云存储和 Azure Databricks 权限要求,请参阅创建 外部位置以将云存储连接到 Azure Databricks 中的“开始之前”。

如果要为工作区的旧 DBFS 根创建外部位置,请参阅“开始之前”部分的为 DBFS 根(旧版)中的数据创建外部位置

创建外部位置的选项

Databricks 建议在 Unity Catalog 中创建外部位置的流程取决于你的情况:

在外部位置启用回退模式

在 Unity 目录中创建外部位置后,在启用了 Unity 目录的计算上运行查询时,对由该外部位置表示的路径的访问由 Unity 目录权限强制实施。 这会中断没有访问路径正确 Unity Catalog 权限的现有工作负载。

当外部位置处于回退模式时,系统会首先检查查询主体对该位置的 Unity Catalog 权限;如果检查不成功,则回退到使用现有的群集级别或笔记本范围的凭证(例如实例配置文件或 Apache Spark 配置属性),以确保您的现有工作负载能够持续不间断地运行。

在迁移旧工作负载的过程中,回退模式非常方便。 更新工作负载,使其成功使用 Unity Catalog 权限运行后,应禁用回退模式,以防止旧群集范围的凭证被用于绕过 Unity Catalog 数据管理。

您可以使用 Catalog Explorer 或 Unity Catalog 外部位置 REST API 启用回退模式。

所需权限:外部位置的所有者。

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标。目录
  2. 快速访问页面上,单击外部数据>
  3. 选择要更新的外部位置。
  4. 打开“回退模式”切换,然后单击“启用”以确认。

API(应用程序编程接口)

以下 curl 示例演示如何在创建外部位置及更新现有外部位置时启用回退模式。

创建新的外部位置:

curl -X POST -H 'Authorization: Bearer <token>' \
https://<workspace-URL>/api/2.1/unity-catalog/external-locations \
--data
'{
  "name": "fallback_mode_enabled_external_location",
  "url": "abfss://container-name@storage-account.dfs.core.windows.net/external_location_container/url",
  "credential_name": "external_location_credential",
  "fallback": true
  "skip_validation": true
}'

更新外部位置:

curl -X PATCH \
-H 'Authorization: Bearer <token>' \
-H 'Content-Type: application/json' \
https://<workspace-URL>/api/2.1/unity-catalog/external-locations/<external-___location-name> \
--data
 '{
   "comment": "fallback mode enabled",
   "fallback": true
  }'

步骤 3:创建外部目录

注释

如果在目录资源管理器中使用了连接创建向导来完成步骤 1,则可能已完成此步骤。 如果在完成步骤 1 时未创建外部目录,或者使用 SQL 创建连接,则必须按照本节中的说明进行作。

在此步骤中,使用在步骤 1 中创建的连接在 Unity 目录中创建一个外部目录,该目录指向在步骤 2 中创建的外部位置。 外部目录是 Unity 目录中的安全对象,它镜像外部数据系统中的数据库或目录,使你能够对 Azure Databricks 工作区中的数据执行查询,访问由 Unity 目录管理。 在这种情况下,镜像目录是你在 Hive 元存储中注册的数据。

每当用户或工作流与外部目录交互时,元数据将从 Hive 元存储同步。

要求

权限要求:

若要创建外部目录,请执行以下操作:

  • Unity Catalog 元存储上的 CREATE CATALOG 特权。
  • 拥有连接的所有权或对连接具有 CREATE FOREIGN CATALOG 特权。
  • 若要输入外来目录的授权路径,您必须在涵盖这些路径的外部位置上具有 CREATE FOREIGN SECURABLE 特权。 默认情况下,外部位置的所有者拥有此特权。

若要使用外部目录,请执行以下操作:

  • 拥有目录或 USE CATALOG 的所有权

计算要求:

  • 若要使用目录资源管理器创建目录:无需计算。
  • 要使用 SQL 创建目录:Databricks Runtime 13.3 LTS 或更高版本。
  • 要使用目录:在 Databricks Runtime 13.3 LTS、14.3 LTS、15.1 及更高版本上使用标准访问模式的计算。

创建外部目录

要创建外部目录,可以使用目录资源管理器,或在 Azure Databricks 笔记本或 SQL 查询编辑器中使用 CREATE FOREIGN CATALOG SQL 命令。

另请参阅管理和使用外部目录

注释

还可以使用 Unity Catalog API。 请参阅 Databricks REST API 参考中的创建目录

目录资源管理器

  1. 在 Azure Databricks 工作区中,单击 “数据”图标以打开目录资源管理器

  2. 在“快速访问”页面上,单击“添加数据”按钮并选择“添加目录”

  3. 输入目录名称,然后选择“类型”为外国的目录。

  4. 从下拉列表中选择 在步骤 1 中创建的连接

  5. 在“授权路径”字段中,输入在步骤 2 中定义为外部位置的云存储位置的路径。 例如,abfss://container@storageaccount.dfs.core.windows.net/demo, abfss://container@storageaccount.dfs.core.windows.net/depts/finance

    授权路径是 Hive 元存储联合支持的外部目录的附加安全层。 请参阅什么是授权路径?

  6. 单击 “创建”

  7. (可选)单击“配置”以打开一个向导,引导你授予目录权限并添加标记。 也可稍后执行这些步骤。

    请参阅管理 Unity Catalog 中特权将标记应用于 Unity Catalog 安全对象

  8. (可选)将目录绑定到特定工作区。

    默认情况下,可以从附加到 Unity Catalog 元存储的任何工作区访问目录(受到用户特权的限制)。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅将目录访问限制到特定工作区

  9. 使用 Hive 元存储元数据填充外部目录。

    每当用户或工作流与外部目录交互时,元数据将从 Hive 元存储同步。 第一个交互填充 Unity Catalog 中的目录,并使其内容在目录资源管理器 UI 中可见。 可通过在目录资源管理器中选择和启动受支持的计算资源来填充目录。 你必须是目录所有者(由于创建了目录,你就是目录所有者)或具有 USE CATALOG 特权的用户。

SQL

在笔记本或 SQL 查询编辑器中运行以下 SQL 命令。 括号中的项是可选的。 替换占位符的值:

  • <catalog-name>:Azure Databricks 中目录的名称。
  • <connection-name>:在步骤 1 中创建的连接对象的名称。
  • <path1>,<path2>:您在步骤 2 中定义为外部位置的云存储位置的路径。 例如,abfss://container@storageaccount.dfs.core.windows.net/demo, abfss://container@storageaccount.dfs.core.windows.net/depts/finance。 授权路径是 Hive 元存储联合支持的外部目录的附加安全层。 请参阅什么是授权路径?。 请参阅什么是授权路径?。 如果在创建目录时未添加授权路径,则可以稍后使用 ALTER CATALOG 添加。 请参阅 ALTER CATALOG
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (authorized_paths '<path1>,<path2>');

只要用户或工作流与联合目录进行交互,元数据就会从 Hive 元存储同步。

注释

如果外部表在 DBFS 上具有存储位置,并且用于该表的 DBFS 挂载点自上次访问后已重新映射到其他路径,则访问该表将失败,并显示 UC_RESOLVED_DBFS_PATH_MISMATCH 错误代码。 使用以下命令更新已解决的 DBFS 位置并修复错误:

REFRESH FOREIGN TABLE my_federated_catalog.schema.table RESOLVE DBFS LOCATION;

你必须是表的所有者或者对表具有“管理”特权。 请参阅 REFRESH FOREIGN (CATALOG, SCHEMA和 TABLE)