使用外部表增强 Snowflake

Boosting Snowflake with External Tables

作为 Snowflake 用户,您可能熟悉它在协作环境中管理数据的优势。Snowflake 的用户体验通常因其直观的界面和无缝的集成功能而受到赞扬。Snowflake 处理各种数据工作负载的能力,从简单的查询到复杂的数据处理任务,使其成为许多数据专业人员不可或缺的工具。然而,历史上一直存在着数据不在 Snowflake 中的差距,原因可能是监管、物流或经济方面的。

Frank Slootman 在 Snowflake 的 2023 财年第二季度财报中强调,Snowflake 的下一个创新领域旨在改变云应用程序的构建、部署、销售和交易方式,进一步强调了该公司向连接到数据存储和创建位置的战略转变。考察这些原则就是云运营模式的基础;它将云视为一种设计原则,而不是一个物理位置,这在很大程度上反映了许多 Snowflake 用户遇到的数据差距问题。2023 财年第一季度财报也反映了这种重点,在支持每一种需要数据访问的工作负载类型方面进行了大量投资。

随着这些趋势的发展,最近的财报表明,Snowflake 正在将重点从存储转向计算,这是由对 AI 能力数据产品的需求不断增长所驱动的。这种旺盛的需求在 Snowflake 的产品收入中显而易见,在 2024 财年第三季度达到 6.985 亿美元,同比增长 34%。这种增长归因于对 AI 和高级分析的计算能力的需求不断增长,而不是纯粹的存储。

为了解决数据可访问性的差距并继续其增长轨迹,Snowflake 一直在外部表方面投入巨资。这些功能允许用户在 Snowflake 中查询和操作存储在外部对象存储中的数据。这种战略方法使 Snowflake 能够将存储职责委派给专门的提供商,同时专注于增强其计算能力,这对 AI 和高级分析至关重要。

将外部数据源集成到 Snowflake 平台中特别强大。通过支持外部表,Snowflake 确保用户可以访问和分析数据,无论其存储位置。这不仅弥合了数据可访问性的历史差距,而且还利用了对象存储解决方案的优势;就 MinIO 而言,包括性能、可用性和可扩展性。继续阅读以了解更多有关在您的 Snowflake 环境中实施此体系结构的详细信息。

简单易用

与 Snowflake 中的大多数事物一样,连接到存储在 MinIO 上的数据相对简单。查询存储在 MinIO 存储桶中的数据就像 **Select * from Bucket1** 一样简单。

设置 Snowflake

还需注意的是,虽然外部表的基本功能在 Snowflake 的各种版本中都可用,但某些高级功能,例如外部表上的物化视图,需要企业版。

您很可能需要联系您的 Snowflake 代表以将您的 MinIO 端点列入白名单。为此请求,您需要收集您的帐户标识符、Snowflake 云和 Snowflake 地区。

设置 MinIO

MinIO 是一种对象存储解决方案,它提供与 Amazon Web Services S3 兼容的 API,支持所有核心 S3 功能。MinIO 旨在将云视为一种运营模式,而不是一个物理位置,可以在各种环境中部署,包括公有云和私有云、裸机基础设施、编排环境和边缘位置。

只有几个关于 MinIO 设置的要求,才能使其与 Snowflake 一起工作。

  1. MinIO 必须设置为允许 DNS 样式访问,并且存储桶必须对公众开放。例如,如果您的 MinIO 服务器位于 https://play.min.io,并且存储桶名为 snowflake,则该存储桶应可通过 https://snowflake.play.min.io 访问。
  2. 目前,区域必须设置为 NULL 或与 Snowflake 实例的区域相同(例如 us-west-2)。您将收到来自 Snowflake 查询的错误消息,因此您将知道它期望哪个区域。

在下面的示例中,存储桶 snowflake 中有 4 个对象,以及文件夹/子前缀 sn1 中的另一个对象。Snowflake 将获取所有这些对象。

示例文件位于 https://docs.snowflake.com/en/user-guide/getting-started-tutorial-prerequisites.html#sample-data-files-for-loading

入门

创建外部表的第一步是创建外部阶段。Snowflake 中的外部阶段用于引用存储文件的外部数据位置(例如对象存储)。它充当指向该数据位置的指针。它们主要用于数据加载和卸载操作,并简化了为批量数据操作准备文件的过程,以及支持外部表。

过去,外部阶段都在 Snowflake 内部。这通常会导致数据重复,而这种架构允许对象存储、Snowflake 中的阶段和 Snowflake 表中的相同数据。但是,企业可以直接将像 MinIO 这样的高性能对象存储设置为外部阶段。

这将执行以下操作

  • 简化数据流入 Snowflake 的过程
  • 允许更快地访问数据进行分析以满足业务需求
  • 确保没有不必要的复制数据,这有助于治理和成本。

以下是您可以在 Snowflake 控制台中执行的示例 SQL 命令,以设置 MinIO 外部阶段。将 url 替换为您的存储桶,将 endpoint 替换为您的端点。

create or replace stage minio_excompstage
  url='s3compat://snowflake/'
  endpoint='play.min.io'
  credentials=(
    AWS_KEY_ID='********'
    AWS_SECRET_KEY='********'
  );

MinIO 用于外部表

Snowflake 中的查询可以直接在外部表上执行,允许企业访问 MinIO 存储桶中的数据,而无需数据迁移。这种架构使用户能够在 Snowflake 环境中读取 MinIO 中的数据,并避免与将数据移入 Snowflake 相关的成本和延迟。外部表的功能与 Snowflake 中的任何其他只读表相同,可以在 JOIN、SELECT 查询中使用,并包含在物化视图中。

初始查询所需的时间将取决于正在传输的数据量,但读取会被缓存,后续查询可能更快,直到下次刷新为止。

这种方法的好处是巨大的

方面

外部表

传统数据导入 Snowflake

设置时间

快速配置,无需大量数据迁移

立即访问外部数据源

需要大量的数据加载和 ETL 过程

复杂的数据导入管道配置

成本效率

无需冗余数据存储

仅为查询期间使用的计算资源付费

由于重复数据存储,成本更高

数据传输和长期存储的成本增加

管理和维护 ETL 基础设施的额外成本

实时数据访问

实时访问和查询数据,无需移动数据

非常适合对实时数据进行即席分析

由于批处理,实时数据访问有限

数据导入后可用性延迟

简单性

易于设置和管理,管理开销最小

与各种外部数据源的集成流程简化

需要专门资源来管理 ETL 过程

数据治理的管理开销更高

以下是在您自己的 Snowflake 中实现外部表的示例 SQL

create or replace external table ext_minio
with location = @minio_excompstage
file_format = (type = csv)
auto_refresh=false
refresh_on_create=false;

alter external table ext_minio refresh;

现在您能够查询您的外部表并将它与 Snowflake 中的其他表连接起来。

select * from ext_minio;

使用 Snowflake CLI(SnowSQL)

上面用于创建的相同命令可以使用 Snowflake CLI(SnowSQL)执行。

您可以在此处找到有关如何在您的平台上安装 SnowSQL 的说明:https://docs.snowflake.com/en/user-guide/snowsql-install-config.html

唯一的区别是您必须从以下命令开始

$ snowsql -a <account_identifier> -u <user_name>

帐户标识符的格式为 <<organization-name>-<account-name>。您可以在 Snowflake 控制台的“管理”页面中找到它。

总结

如果您是希望添加 Snowflake 功能的 MinIO 客户,或者您是希望将 Snowflake 功能扩展到存储在 Snowflake 之外的数据的 Snowflake 客户,请尝试一下。无论哪种方式,使用外部表,您都可以从当前的基础设施投资中获得更多收益。如有任何问题,请联系我们 hello@min.io 或我们的 Slack 频道。