使用 MinIO 作为外部表扩展 Snowflake

Snowflake 现已成为云数据仓库平台的实际标准。它的架构支持从管道、ETL、分析到治理的各种数据任务。传统上,企业需要将所有数据迁移到 Snowflake 中才能利用 Snowflake 的功能。
然而,Snowflake 意识到企业希望将数据集成到任何地方,而无需迁移数据。因此,随着外部表支持的引入,企业现在可以实现这一目标。
这对 Snowflake 部署的经济效益以及 Snowflake 平台可用于分析和数据科学的数据量都有实际的影响。
外部表的存在不会改变 Snowflake 运行的位置——它仍然只在三大主流公有云(AWS、GCP、Azure)中运行。但它将不再需要将所有数据存储在 Snowflake 中才能进行操作。
MinIO 可能成为此变革的最大受益者。MinIO 是一款高性能、云原生对象存储。它可以在所有类型的 Kubernetes(上游、EKS、AKS、GKE 等)以及虚拟机(如公有云虚拟机、VMWare 等)和裸机硬件上运行。因此,MinIO 可以成为 Snowflake 客户的全球数据存储——无论他们的数据位于何处。
为了保证正确的数据能够被正确用户访问,对这些多云数据湖进行细粒度访问控制至关重要。MinIO 与第三方 IDP 集成的能力及其成熟的基于策略的访问控制 (PBAC) 功能确保了这一点不是事后诸葛亮。
虽然 Snowflake 将支持 S3 终结点(自然也包括其他对象存储),但这些对象存储无法在企业存储数据的每个地方运行。例如,设备无法在公有云或 OpenShift 或 Tanzu 上运行。为了实现一致的、数据随处可得的策略,企业需要采用 MinIO。
此外,Snowflake 已成为企业中的关键任务。以至于现在已经将弹性架构到这些系统中。这种弹性不仅考虑到云中的区域故障,还考虑到整个云故障。
正如我之前所写,依赖单一云已被证明是一种糟糕的架构。MinIO 可以随处可用,并在私有云、公有云和边缘云之间进行复制,因此它提供了多云数据可用性的唯一真正解决方案。
易于使用
那么,对于最终用户来说,它有多简单呢?假设你在 MinIO 中有一个名为“Bucket1”的存储桶。你可以对其进行设置,以便可以像运行普通表一样在上面运行任何 SnowSQL 命令。
例如:Select * from Bucket1;

与 Snowflake 中的大多数功能一样,连接到存储在 MinIO 上的数据也相对简单。
以下是你开始使用所需的步骤:
设置 Snowflake
需要为你的 Snowflake 环境启用外部表支持。如果出现诸如“在:'s3compat://snowflake/' 中发现无效的 URL 前缀”之类的错误,这可能意味着它没有启用。请联系你的 Snowflake 代表以启用它。
设置 MinIO
MinIO 设置只有几个要求才能使其与 Snowflake 协同工作。
- 必须将 MinIO 设置为允许 DNS 样式访问,并且存储桶必须公开可用。
- 目前,区域必须设置为 NULL 或与 Snowflake 实例的区域相同(例如,“us-west-2”)。你会从 Snowflake 查询中收到一条错误消息,因此你会知道它期望哪个区域。
在下面的示例中,存储桶“snowflake”中有 4 个对象,另一个对象位于文件夹/子前缀“sn1”中。Snowflake 将获取所有这些对象。
为了将其与 Snowflake 集成,如果 MinIO 服务器位于 https://play.min.io,则存储桶应该可以在 https://snowflake.play.min.io 访问。
有两种方法可以将 MinIO 存储桶与 Snowflake 集成。第一个是作为“暂存区”,第二个是作为外部表。让我们看看这两种方法。
暂存区访问
作为 ETL 过程的一部分,数据通常从数据源或数据湖中选择和准备,移动到暂存区,然后加载到数据仓库中,以便对其进行查询。
传统上,Snowflake 的这些暂存区位于 Snowflake 本身,因此流程如下
数据湖(本地、公有云等)-> Snowflake 暂存区 -> Snowflake 内部表
企业现在可以将 MinIO 设置为暂存区,并将数据直接移动到 Snowflake 内部表中以对其进行查询。
这样做可以:
- 简化流程
- 允许数据更快地用于分析,以满足业务需求
- 确保没有不必要的复制数据,这有助于治理和降低成本。
新的流程将是:MinIO 中的数据(本地、公有云等)-> Snowflake 内部表
以下示例显示在 Snowflake 控制台中,但也可以通过 Snowflake CLI 运行。
对于 play.min.io,使用
AWS_KEY_ID='Q3AM3UQ867SPQQA43P2F'
AWS_SECRET_KEY='zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'
有关 Snowflake CREATE STAGE 命令的参考,请访问此处:https://docs.snowflake.com/en/sql-reference/sql/create-stage.html
外部表访问
Snowflake 中的查询必须在内部表上执行。这意味着所有数据(即使是临时查询)也必须移动到 Snowflake 中。这会导致成本和无法及时进行查询。
企业现在可以使用 Snowflake 推出的新的外部表访问功能直接访问 MinIO 存储桶中的数据。
初始查询所花费的时间将取决于要传输的数据量,但读取结果将被缓存,后续查询可能会更快,直到下一次刷新。
使用外部表方法,不需要复制数据,存储桶可以用作外部表来进行查询、联接等操作。
但是,作为交换,好处是巨大的。
- 这扩展了数据仓库的功能,而不会产生移动数据的成本。
- 现在可以对实时数据进行分析。
- 可以完全避免仅为了运行临时查询而移动数据。
- 在数据因合规性或其他业务原因无法移动的情况下,可以进行分析。
- 你仍然可以获得与 Snowflake 功能相同的所有优势,同时使用相同的资源,而这些资源已经熟悉 Snowflake 平台。
下面是一个示例:
有关 Snowflake CREATE EXTERNAL TABLE 命令的参考,请访问此处:https://docs.snowflake.com/en/sql-reference/sql/create-external-table.html
使用 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 控制台的管理页面中找到它。
总结
就是这样。
如果你是一名 MinIO 客户,希望添加 Snowflake 功能,或者如果你是一名 Snowflake 客户,希望将 Snowflake 的功能扩展到存储在 Snowflake 之外的數據,请尝试一下。无论哪种方式,你都可以从目前的投资中获得更多收益。