本文介绍如何联邦化外部 Hive 元数据库,以便组织能够使用 Unity Catalog 访问和管理 Hive 元数据库表。
有关 Hive 元存储联合的概述,请参阅 Hive 元存储联合:启用 Unity Catalog 来管理 Hive 元存储中注册的表。
在您开始之前
查看 Hive Metastore 联邦支持的服务和功能列表:要求和功能支持。
下文列出了每个步骤的具体要求。
步骤 1:将 Unity Catalog 连接到外部 Hive 元存储
在此步骤中,你将创建作为 Unity Catalog 安全对象的一个连接,该对象指定用于访问数据库系统(本例中为 Hive 元存储)的路径和凭证。
要求
必须满足以下条件:
- 用于访问托管 Hive 元存储数据库系统的用户名和密码。
- 数据库的 URL(主机和端口)。
- 数据库名称。
- Unity Catalog 元存储上的 CREATE CONNECTION特权。 默认情况下,元存储管理员具有此权限。
创建连接
若要创建连接,可以使用目录资源管理器,或者使用 Azure Databricks 笔记本或 Databricks SQL 查询编辑器中的 CREATE CONNECTION SQL 命令。
注释
你还可以使用 Databricks REST API 或 Databricks CLI 来创建连接。 请参阅 POST /api/2.1/unity-catalog/connections 和 Unity Catalog 命令。
目录资源管理器
- 在 Azure Databricks 工作区中,单击 - 目录。 
- 在“快速访问”页面上,单击“添加数据 > 添加连接”。 
- 在“设置连接”向导的“连接基本信息”页面上,输入用户友好的连接名称。 
- 对于“连接类型”,选择“Hive 元存储”;对于“元存储类型”,选择“外部”。 
- (可选)添加注释。 
- 单击 “下一步” 。 
- 在 “身份验证 ”页上,为主机数据库输入以下内容: - 
              主机:例如 mysql-demo.lb123.cn-north-2.rds.amazonaws.com
- 
              端口:例如 3306
- 
              用户:例如 mysql_user
- 
              密码:例如 password123
 
- 
              主机:例如 
- 单击 “下一步” 。 
- 在 “连接详细信息 ”页上,为主机数据库选择或输入以下内容: - 数据库类型:选择 MySQL、 SQLSERVER 或 POSTGRESQL。
- 版本:支持的 Hive 元存储版本包括 0.13、2.3 和 3.1。
- 数据库:要连接的数据库的名称。
 - (可选)如果数据库实例不使用 CA 签名的服务器证书,请选择 “信任服务器证书”。 
- 单击“ 创建连接”。 
- 在 “目录基本信息 ”页上,输入外国目录的名称。 
- 对于 授权路径,请选择可通过目录访问的云存储路径。 只有属于这些路径的表才能通过联合目录查询。 路径必须由外部位置覆盖。 有关详细信息,请参阅 什么是授权路径?。 
- 在 “访问 ”页上,选择用户可以在其中访问所创建的目录的工作区。 您可以选择所有工作区均具有访问权限,或单击分配到工作区,选择工作区,然后单击分配。 
- 添加一个所有者,该 所有者 将能够管理对目录中所有对象的访问。 开始在文本框中键入用户或组,然后单击返回的结果中的用户或组。 
- 授予对目录的“特权”。 - 单击授权。
- 指定将有权访问目录中对象的 主体 。 开始在文本框中键入用户或组,然后单击返回的结果中的用户或组。
- 选择每个用户或组要授予的Privilege 预设。 默认情况下,向所有帐户用户授予 BROWSE。- 从下拉菜单中选择 “数据读取者 ”,以授予 read对目录中对象的权限。
- 从下拉菜单中选择 “数据编辑器”,以向 read和modify授予目录中对象的权限。
- 手动选择要授予的权限。
 
- 从下拉菜单中选择 “数据读取者 ”,以授予 
- 单击授权。
 
- 单击 “下一步” 。 
- 在 “元数据 ”页上,可以选择将标记指定为键值对。 有关详细信息,请参阅 将标记应用于 Unity 目录安全对象。 
- (可选)添加注释。 
- 单击“ 保存”。 
SQL
在笔记本或 SQL 查询编辑器中运行以下命令。
CREATE CONNECTION <connection-name> TYPE hive_metastore
OPTIONS (
  host '<hostname>',
  port '<port>',
  user '<user>',
  password '<password>',
  database '<database-name>',
  db_type 'MYSQL',
  version '2.3'
);
建议对敏感值(如凭据)使用 Azure Databricks 机密 ,而不是纯文本字符串。 例如:
CREATE CONNECTION <connection-name> TYPE hive_metastore
OPTIONS (
  host '<hostname>',
  port '<port>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>'),
  database '<database-name>',
  db_type 'MYSQL',
  version '2.3'
);
如果必须在笔记本 SQL 命令中使用纯文本字符串,请通过使用 $ 转义特殊字符(例如 \)来避免字符串被截断。 例如: \$。
有关设置机密的详细信息,请参阅机密管理。
步骤 2:为 Hive 元存储中的数据创建外部位置
在此步骤中,在 Unity Catalog 中配置外部位置,以控制对保存外部 Hive 元存储中所注册数据的云存储位置的访问。
外部位置是将存储凭证与云存储容器路径相关联的 Unity Catalog 安全对象。
创建外部位置的选项
Databricks 建议在 Unity Catalog 中创建外部位置的流程取决于你的情况:
- 如果要联合 Hive 元存储,该元存储将数据存储在 DBFS 装载 中,请使用 目录资源管理器 或 SQL 创建外部位置,并使用 “从 DBFS 装载复制 ”选项。 另请参阅“连接到 DBFS 根外部位置”(旧版)。
在外部位置启用回退模式
在 Unity 目录中创建外部位置后,在启用了 Unity 目录的计算上运行查询时,对由该外部位置表示的路径的访问由 Unity 目录权限强制实施。 这会中断没有访问路径正确 Unity Catalog 权限的现有工作负载。
当外部位置处于回退模式时,系统会首先检查查询主体对该位置的 Unity Catalog 权限;如果检查不成功,则回退到使用现有的群集级别或笔记本范围的凭证(例如实例配置文件或 Apache Spark 配置属性),以确保您的现有工作负载能够持续不间断地运行。
在迁移旧工作负载的过程中,回退模式非常方便。 更新工作负载,使其成功使用 Unity Catalog 权限运行后,应禁用回退模式,以防止旧群集范围的凭证被用于绕过 Unity Catalog 数据管理。
您可以使用 Catalog Explorer 或 Unity Catalog 外部位置 REST API 启用回退模式。
所需权限:外部位置的所有者。
目录资源管理器
- 在 Azure Databricks 工作区中,单击 - 目录。 
- 在快速访问页面上,单击外部数据>。 
- 选择要更新的外部位置。 
- 打开“回退模式”切换,然后单击“启用”以确认。 
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.chinacloudapi.cn/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 参考中的创建目录。
目录资源管理器
- 在 Azure Databricks 工作区中,单击 - 以打开目录资源管理器。 
- 在“快速访问”页面上,单击“添加数据”按钮并选择“添加目录”。 
- 输入目录名称,然后选择“类型”为外国的目录。 
- 从下拉列表中选择 在步骤 1 中创建的连接。 
- 在“授权路径”字段中,输入在步骤 2 中定义为外部位置的云存储位置的路径。 例如, - abfss://container@storageaccount.dfs.core.chinacloudapi.cn/demo, abfss://container@storageaccount.dfs.core.chinacloudapi.cn/depts/finance。- 授权路径是 Hive 元存储联合支持的外部目录的附加安全层。 请参阅什么是授权路径?。 
- 单击 “创建” 。 
- (可选)单击“配置”以打开一个向导,引导你授予目录权限并添加标记。 也可稍后执行这些步骤。 
- (可选)将目录绑定到特定工作区。 - 默认情况下,可以从附加到 Unity Catalog 元存储的任何工作区访问目录(受到用户特权的限制)。 如果只想允许从特定工作区进行访问,请转到“工作区”选项卡并分配工作区。 请参阅将目录访问限制到特定工作区。 
- 使用 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.chinacloudapi.cn/demo, abfss://container@storageaccount.dfs.core.chinacloudapi.cn/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 元存储同步。