Snowflake Open Catalog 概述

Snowflake Open Catalog 是 Apache Iceberg™ 表的目录实现,基于开源 Apache Iceberg™ REST 协议构建。Snowflake Open Catalog 是为 Apache Polaris™ (incubating) (https://github.com/apache/polaris) 提供的托管服务。

使用 Open Catalog,可以跨不同 REST-兼容的查询引擎提供对 Iceberg 表的集中式安全读取和写入权限。

Open Catalog 当前作为托管在 Snowflake 管理基础设施中的服务提供。

![Open Catalog 的概念图。](img/overview.svg“Open Catalog 概述”)

注册

Open Catalog 提供以下注册选项:

  • **对于现有的 Snowflake 客户:**以组织管理员身份登录现有的 Snowflake 账户,并在 Snowflake 组织中创建一个新 Open Catalog 账户。拥有 Snowflake 中的 ORGADMIN 角色的用户可以通过 Snowflake 管理 Open Catalog 账户。有关说明,请参阅 [创建 Snowflake Open Catalog 账户](./create-open-catalog-account.md)。

  • **如果您不是现有 Snowflake 客户:**可以注册一个 Snowflake 试用账户,免费试用 Snowflake Open Catalog 30 天。有关说明,请参阅 [免费试用 Snowflake Open Catalog](./try-open-catalog-for-free.md)。

关键概念

本节介绍使用 Snowflake 中托管的 Open Catalog 相关的关键概念。

下图显示了 Catalog1 中带有嵌套 命名空间 的 [Open Catalog 结构](overview.md#catalog)示例。尚未为 Catalog2 或 Catalog3 创建表或命名空间。

![显示 Open Catalog 结构示例的图表。](img/sample-catalog-structure.svg“Open Catalog 结构示例”)

目录

在 Open Catalog 中,可以创建一个或多个目录资源来组织 Iceberg 表。

通过设置 S3、Azure 或 Google Cloud Storage 存储配置中的值来配置目录。Iceberg 目录使查询引擎能够管理和组织表。目录构成了 [Apache Iceberg™ 表规范](https://iceberg.apache.org/spec/#overview)中的第一个架构层,且必须支持以下任务:

  • 存储一个或多个 Iceberg 表的当前元数据指针。元数据指针将表名称映射到该表的当前元数据文件的位置。

  • 请执行原子操作,以便将表的当前元数据指针更新为表的新版本元数据指针。

要了解有关 Iceberg 目录的更多信息,请参阅 Apache Iceberg™ 文档 (https://iceberg.apache.org/concepts/catalog/)。

目录类型

目录可以是以下两种类型之一:

  • 内部目录:该目录由 Open Catalog 管理。可以在 Open Catalog 中读取和写入此目录中的表。

  • 外部目录:该目录由另一个 Iceberg 目录提供商(例如,Snowflake、Glue、Dremio Arctic)在外部管理。此目录中的表已同步到 Open Catalog。Open Catalog 中的这些表为只读状态。在当前版本中,仅提供 Snowflake 外部目录。

目录配置了存储配置,可以指向 S3、Azure 存储或 GCS。

要创建新目录,请参阅 [创建目录](create-catalog.md“Open Catalog 结构示例”)。

命名空间

您可以创建命名空间来对目录中的 Iceberg 表进行逻辑分组。一个目录可以有多个命名空间。您还可以创建嵌套命名空间。Iceberg 表属于命名空间。

Apache Iceberg™ 表和目录

在内部目录中,Iceberg 表在 Open Catalog 中注册,但通过查询引擎进行读取和写入。表数据和元数据存储在外部云存储中。该表使用 Open Catalog 作为 Iceberg 目录。

重要

如果在 Snowflake Open Catalog 中删除一个表而不清除它,则不要创建与所删除的表具有相同名称和位置的新表。如果这样做,用户可能会在没有权限访问原始表数据的情况下访问这些数据。例如,如果删除但不清除 Table1,其存储目录位置为 /MyCatalog/Schema1/Table1,则不要在同一 Table1 存储目录中创建新的 Table1。当删除一个表而不清除它时,其数据会保留在外部云存储中。

若具备使用 Snowflake 作为 Iceberg 目录的表(Snowflake 管理的表),可将这些表同步到 Open Catalog 中的外部目录。若将此目录同步到 Open Catalog,它将作为外部目录出现在 Open Catalog 中。表数据和元数据存储在外部云存储中。Snowflake 查询引擎可以读取或写入这些表。但是,其他查询引擎只能从这些表中读取。

重要

为确保正确执行为目录定义的访问权限,必须满足以下条件:

  • 一个目录只包含属于一个表的数据文件。

  • 目录层次结构与目录的命名空间层次结构相匹配。

例如,如果目录包括以下项目:

  • 顶级命名空间 namespace1

  • 嵌套命名空间 namespace1a

  • 在嵌套命名空间 namespace1a 下分组的 customers

  • 在嵌套命名空间 namespace1a 下分组的 orders

目录的目录层次结构必须是:

  • /namespace1/namespace1a/customers/<files for the customers table *only*>

  • /namespace1/namespace1a/orders/<files for the orders table *only*>

这些条件适用于内部和外部目录,包括包含 Snowflake 管理的 Apache Iceberg™ 表 的外部目录。在内部目录中创建表时,Open Catalog 禁止在现有表的目录或子目录中创建表。在外部目录中创建 Snowflake 管理的 Iceberg 表时,Open Catalog 不会禁止目录位置重叠。因此,在创建这些表时,请使用 BASE_LOCATION 参数为每个表指定唯一的父目录。有关更多信息,请参阅 CREATE ICEBERG TABLE(使用 Snowflake 作为 Iceberg 目录)

有关内部和外部目录的更多信息,请参阅 目录类型

服务主体

服务主体是您在 Open Catalog 中创建的实体。每个服务主体都封装了用于连接 Open Catalog 的凭据。

查询引擎使用服务主体连接到目录。

Open Catalog 生成客户端 ID 以及每个服务主体的客户端密钥对。

下表显示了您可能在 Open Catalog 中创建的服务主体示例:

服务连接名称

目的

Flink 引入

供 Apache Flink® 将流数据引入 Apache Iceberg™ 表。

Spark ETL 管道

供 Apache Spark™ 在 Iceberg 表上运行 ETL 管道作业。

Snowflake 数据管道

供 Snowflake 运行数据管道转换 Apache Iceberg™ 表中的数据。

Trino BI 仪表板

供 Trino 运行为仪表板供电的 BI 查询。

Snowflake AI 团队

供 Snowflake 在 Apache Iceberg™ 表中的数据上运行 AI 作业。

服务连接

服务连接代表可以向 Open Catalog 读取和写入数据的 REST 兼容引擎(例如 Apache Spark™、Flink® 或 Trino)。创建新的服务连接时,Open Catalog 管理员将向使用新服务连接创建的服务主体授予新的或现有的主体角色。主体角色是 Open Catalog 中的一种资源,可以使用它对 Open Catalog 服务主体进行逻辑分组,并授予对安全对象的权限。有关详细信息,请参阅 [主体角色](access-control.md#principal-role“主体角色”)。Open Catalog 使用基于角色的访问控制 (RBAC) 模型来授予服务主体访问资源的权限。有关更多信息,请参阅 [访问控制](access-control.md“访问控制”)。有关该模型的图表,请参阅 [RBAC 模型](access-control.md#rbac-model“RBAC 模型”)。

如果 Open Catalog 管理员为新服务连接的服务主体授予新主体角色,则服务主体尚未被授予任何权限。在确保新服务连接将连接到的目录的安全时,Open Catalog 管理员将授予目录角色权限,然后将这些目录角色授予新的主体角色。这样,新服务连接的服务主体便具有这些权限。有关目录角色的更多信息,请参阅 [目录角色](access-control.md#catalog-role“目录角色”)。

如果 Open Catalog 管理员将现有主体角色授予新服务连接的服务主体,则服务主体将获得授予现有主体角色的目录角色的权限。如有需要,Open Catalog 管理员可以向现有主体角色授予其他目录角色或从中移除目录角色,以调整授予服务主体的权限。有关 RBAC 如何在 Open Catalog 中运作的示例,请参阅 [RBAC 示例](access-control.md#rbac-example“RBAC 示例”)。

存储配置

存储配置存储生成的身份和访问管理 (IAM) 实体,用于外部云存储,并在您创建目录时创建。存储配置用于设置将 Open Catalog 连接到云存储的值。在目录创建过程中,会生成 IAM 实体并用于创建云存储提供商和 Open Catalog 之间的信任关系。

创建目录时,需要提供有关外部云存储的以下信息:

云存储提供商

信息

Amazon S3

<ul><li>Amazon S3 桶的默认基本位置</li><li>Amazon S3 桶的位置</li><li>S3 角色 ARN</li><li>外部 ID (可选)</li></ul>

Google Cloud Storage (GCS)

<ul><li>GCS 桶的默认基本位置</li><li>GCS 桶的位置</li></ul>

Azure

<ul><li>Microsoft Azure 容器的默认基本位置</li><li>Microsoft Azure 容器的位置</li><li>Azure 租户 ID</li></ul>

示例工作流程

在下面的示例工作流程中,Bob 创建了一个名为 Table1 的 Apache Iceberg™ 表,Alice 从 Table1 中读取数据。

  1. Bob 使用 Apache Spark™ 在 Catalog1 目录的 Namespace1 命名空间下创建 Table1 表并将值插入 Table1。

    Bob 可以创建 Table1 并在其中插入数据,因为他使用的服务连接包含的服务主体拥有执行这些操作的权限。

  2. Alice 使用 Snowflake 从 Table1 中读取数据。

    Alice 可以从 Table1 中读取数据,因为她使用的服务连接包含一个具备目录集成的服务主体,该服务主体具有执行此操作的权限。Alice 在 Snowflake 中创建了一个非托管表来从 Table1 中读取数据。

![显示 Open Catalog 示例工作流程的图表](img/example-workflow.svg“Open Catalog 示例工作流程”)

安全和访问控制

本节介绍安全和访问控制。

凭据交易

凭据交易通过集中管理以下项目的访问权限,简化了 Open Catalog 中的访问控制:

  • Open Catalog 内的元数据

  • Apache Iceberg 表的存储位置

当为目录启用凭据交易时,Open Catalog 会向执行查询的查询引擎提供临时存储凭据。此凭据允许查询引擎访问 Iceberg 表的底层目录位置。若启用凭据交易功能,则无需在 Open Catalog 之外单独管理存储访问。

外部目录凭据交易

您可以选择为每个外部目录启用凭据交易。若没有为目录启用凭据交易,则必须在 Open Catalog 之外向查询引擎单独提供您自己的存储凭据。

在为外部目录启用凭据交易之前,请注意 Open Catalog 不会阻止目录中的 Iceberg 表具有重叠的存储目录位置。当表的存储目录位置重叠时,用户可以访问他们无权访问的表。在为外部目录启用凭据交易之前,请确保目录中的表没有重叠的存储目录位置。

例如,考虑以下目录位置:

  • Table1 的存储目录位置为 /MyCatalog/Schema1/Table1

  • Table2 的存储目录位置为 /MyCatalog/Schema1/Table1/Table2

拥有 Table1 交易凭据的用户也将有权访问 Table2 的存储位置。

下面示例说明如何解决存储目录位置重叠的问题:

  • Table1 的存储目录位置为 /MyCatalog/Schema1/Table1

  • Table2 的存储目录位置为 /MyCatalog/Schema1/Table2

要为外部目录启用凭据交易,请参阅 为外部目录启用凭据交易

内部目录凭据交易

创建目录时,默认启用内部目录的凭据交易。您无需启用。在内部目录中创建表时,Open Catalog 禁止在现有表的目录或子目录中创建表。

身份和访问管理(IAM)

Open Catalog 使用身份和访问管理(IAM)实体安全地连接存储,以访问表数据、Iceberg 元数据以及存储表架构、分区和其他元数据的清单文件。Open Catalog 保留存储位置的 IAM 实体。

访问控制

Open Catalog 强制执行您在服务中注册的所有表上配置的访问控制,并以一致的方式管理来自查询引擎的所有查询的安全性。

Open Catalog 使用基于角色的访问控制(RBAC)模型,可让您集中配置 Open Catalog 服务主体对目录、命名空间和表的访问权限。

Open Catalog RBAC 使用两种不同的角色类型来委派权限:

  • 主体角色:授予 Open Catalog 服务主体,类似于您授予服务主体的其他访问控制系统中的角色。

  • 目录角色:配置对 Open Catalog 资源的特定权限并授予主体角色。

有关更多信息,请参阅 [访问控制](access-control.md“访问控制”)。

计费

Open Catalog 正式发布后的前六个月内可免费使用。2025 年年中开始计费。

开始计费时,Snowflake 会根据您向 Open Catalog 服务支持的 REST APIs 请求向账户收费。有关更多信息,请参阅 [Snowflake 服务使用量表] 中的无服务器功能表(https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf)。

Snowflake 不会就存储在其之外的 Iceberg 表收取账户费用。云存储提供商会直接向您收取数据存储使用费。

语言: 中文