使用外部表增强 Snowflake

作为 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 一起工作。
- MinIO 必须设置为允许 DNS 样式访问,并且存储桶必须对公众开放。例如,如果您的 MinIO 服务器位于 https://play.min.io,并且存储桶名为 snowflake,则该存储桶应可通过 https://snowflake.play.min.io 访问。
- 目前,区域必须设置为 NULL 或与 Snowflake 实例的区域相同(例如
us-west-2
)。您将收到来自 Snowflake 查询的错误消息,因此您将知道它期望哪个区域。
在下面的示例中,存储桶 snowflake
中有 4 个对象,以及文件夹/子前缀 sn1
中的另一个对象。Snowflake 将获取所有这些对象。
入门
创建外部表的第一步是创建外部阶段。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 中实现外部表的示例 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 频道。