本文介绍如何通过目录联邦启用 Snowflake 联邦功能。 与 查询联合相比,目录联合允许 Unity 目录查询直接针对文件存储运行,从而提供更好的性能和成本效益。
通过目录联合,Unity Catalog 直接访问对象存储中的外部表。 查询仅使用 Databricks 计算执行,后者更具成本效益和性能优化。
目录联合身份验证和查询联合身份验证都依赖于相同的身份验证方法来设置连接:
在您开始之前
必须满足以下要求,才能使用目录联合在 Snowflake 上运行联合查询:
工作区要求:
- 已为 Unity Catalog 启用工作区。
计算要求:
- 计算资源与目标数据库系统之间的网络连接。 请参阅 Lakehouse Federation 网络建议。
- Azure Databricks 计算必须使用 Databricks Runtime 13.3 LTS 或更高版本以及 标准 或 专用 访问模式。
- SQL 仓库必须是专业或无服务器,并且必须使用 2023.40 或更高版本。
所需的权限:
- 若要创建连接,你必须是元存储管理员或对附加到工作区的 Unity Catalog 元存储具有
CREATE CONNECTION权限的用户。 - 若要创建外部目录,你必须对元存储具有
CREATE CATALOG权限,并且是连接的所有者或对连接具有CREATE FOREIGN CATALOG特权。
后面的每个基于任务的部分中都指定了其他权限要求。
- 使用 Databricks Runtime 16.4 LTS 或更高版本或 Databricks SQL。
设置目录联合
设置目录联合的常规步骤类似于设置查询联合:首先创建与 Snowflake 的连接,然后创建和配置外部目录。 还需要为在 Snowflake 中注册的 Apache Iceberg 表路径创建存储凭据和外部位置。
为 Iceberg 表创建外部存储位置。
必须在 Unity Catalog 中配置一个外部位置,以管理对存储在 Snowflake 数据库中注册的 Iceberg 表的云存储位置的访问。 外部位置是 Unity Catalog 的安全对象,用于将存储凭据与云存储容器路径关联。 请参阅 外部位置概述。
可以使用以下接口创建外部位置:
外部位置将在外部目录配置期间指定为授权路径。
使用上面列出的身份验证方法之一创建与 Snowflake Horizon 目录的连接并创建外部目录。 必须在云存储中指定一个位置,来存储此目录中的 Iceberg 表的元数据。
在目录中配置存储位置后,可以通过对象存储在外部目录中读取 Iceberg 表。 通过 JDBC 协议读取或写入 Iceberg 表将不再可用(不会影响非冰山表)。
还必须添加 授权路径,即可通过目录访问的云存储路径。 只有属于这些路径的表才能通过联合目录查询。 路径必须由外部位置覆盖。
目录联合限制
使用目录联合针对 Snowflake 运行联合查询具有以下限制:
- 某些冰山表只能使用查询联合进行读取:
- 具有 URI 不兼容位置(包含特殊字符)的表。
- 元数据位置在表位置之外的表。
- 具有不受支持的架构的位置的表(仅支持
s3、s3a、s3n、abfs、abfss、gs、r2、wasb和wasbs)。
- 必须使用外部引擎访问的 Foreign Iceberg 表进行刷新
REFRESH FOREIGN TABLE <table_name>,以确保写入外部目录与使用 Unity 目录进行读取/写入之间的一致性。 - 名称相同(不区分大小写)的表发生冲突。 首先加载的是第一个出现的表。
- 对于 Azure,Snowflake Iceberg 表不能位于容器的根位置。
有关 Iceberg 的相关限制,请参阅 Iceberg 表限制。
确定外部 Snowflake 表是使用目录功能还是查询联合功能。
使用目录联合身份验证读取的外国 Snowflake 表在目录资源管理器中显示 Iceberg 源格式。 使用查询联合读取的 Iceberg 表在目录资源管理器中显示 Snowflake 源格式。 使用使用 Snowflake 计算的查询联合执行针对具有两种存储格式的表运行的查询。
回退模式
在联合 Snowflake 目录中查询表时,Databricks 会自动尝试直接从云存储读取 Iceberg 表,以获得最佳性能。 如果表不符合直接访问的条件,Databricks 会使用 JDBC 将查询转发至 Snowflake 进行联合访问。 下表概述了查询解析流:
| 查询解析阶段 | Description |
|---|---|
| 目录发现 | 在查询规划期间,Databricks Runtime 会检查 Unity 目录,并检测表是否驻留在 Snowflake 联合目录中。 |
| Snowflake 元数据解析 | 使用 Unity 目录连接,Databricks Runtime 向 Snowflake 发出查询,以便:
|
| 直接访问尝试 | 如果以下任一条件失败,Databricks Runtime 将使用 Snowflake JDBC 驱动程序联合查询。 该表在目录资源管理器中显示 Snowflake 源格式。
如果满足所有条件,Databricks Runtime 会检查返回的元数据,并从对象存储路径直接读取 Iceberg 表。 该表在目录资源管理器中显示 Iceberg 源格式。 |