使用兼容 Amazon S3 的存储¶
本主题提供的信息可帮助您从 Snowflake 访问与 Amazon S3 兼容的存储。
如果存储应用程序或设备提供的应用程序编程接口 (API) 符合行业标准的 Amazon Simple Storage Service (S3) REST API (https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html),则该应用程序或设备与 Amazon S3 兼容。Amazon S3 REST API 支持对桶和对象执行 CRUD 操作和管理操作。
借助 Snowflake,您可以使用外部暂存区连接到越来越多的与 S3 兼容的存储解决方案,包括本地存储和存在于公有云之外的设备。外部暂存区存储符合 S3 标准的 API 端点、桶名称和路径以及凭证。要允许用户从存储位置加载和卸载数据,可以向角色授予暂存区的权限。
可以使用 Snowflake 对兼容 Amazon S3 的存储的支持来执行以下任务:
从外部暂存区查询数据,而无需将数据加载到 Snowflake 中。有关更多信息,请参阅 使用外部表扩展数据湖。
读取和处理非结构化数据。要了解更多信息,请参阅 处理非结构化数据。
使用 COPY FILES 命令将 S3 兼容存储中的文件从一个位置复制到另一个位置。
云平台支持¶
此功能适用于托管在以下受支持的 云平台 上的 Snowflake 账户:
Amazon Web Services
Google Cloud
Microsoft Azure
与 S3 兼容的存储的要求¶
与 S3 兼容的 API 端点用于 Snowflake,必须满足以下要求:
与 S3 API 高度兼容,并且能够通过 公共测试套件 (https://github.com/snowflakedb/snowflake-s3compat-api-test-suite) (在 GitHub 中)。如果端点的行为与 S3 不同,则无法与 Snowflake 结合使用。
作为与 Snowflake S3 兼容的、经过测试且合规的服务,由第三方存储提供商提供支持。有关至少测试了部分产品并发现它们可与 Snowflake 配合使用的供应商列表,请参阅 供应商支持与 S3 兼容的存储。
可从托管 Snowflake 账户的公有云进行访问。
高可用性和高性能,可满足分析需求。
配置为使用虚拟托管样式的请求。有关更多信息,请参阅 Amazon S3 文档中的 桶的虚拟托管 (https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html)。
使用具有有效 TLS 证书的 HTTPS 通信。
配置为使用直接凭证。
不包含端口号。例如,不支持端点 mystorage.com:3000。
重要
不会为所有账户自动启用与 Amazon S3 兼容的端点。要提出请求,请联系 Snowflake 账户团队或 Snowflake 支持部门 (https://community.snowflake.com/s/article/How-To-Submit-a-Support-Case-in-Snowflake-Lodge)。在发送请求之前,请确保已使用 公共测试套件 (https://github.com/snowflakedb/snowflake-s3compat-api-test-suite) (在 GitHub 中)验证了端点。
在请求中提供以下信息:
Snowflake 账户名称和云区域部署。
端点 URL(即 my-s3-endpoint.company.com)。
提供端点的软件或硬件供应商。
为兼容 S3 的存储创建外部暂存区¶
要为兼容 S3 的存储创建外部暂存区,请使用 CREATE STAGE 命令创建命名 外部暂存区。命名的暂存区对象可用于列出文件、加载数据和卸载文件等 SQL 操作。
(可选)在外部暂存区添加 目录表。可以查询目录表以检索文件 URLs,以访问引用存储中的文件以及其他元数据。
备注
添加目录表时,必须将 AUTO_REFRESH 参数设置为 FALSE。无法自动刷新与 S3 兼容的外部暂存区的元数据。
以下示例创建一个名为 my_s3_compat_stage
的外部暂存区,该暂存区指向端点 mystorage.com
处命名的 my_bucket/files/
的桶和路径。本示例中使用的 AWS_KEY_ID 和 AWS_SECRET_KEY 的值仅用于说明目的。
CREATE STAGE my_s3compat_stage
URL = 's3compat://my_bucket/files/'
ENDPOINT = 'mystorage.com'
CREDENTIALS = (AWS_KEY_ID = '1a2b3c...' AWS_SECRET_KEY = '4x5y6z...')
加载和卸载数据¶
您可以使用为兼容 S3 的存储所配置的外部暂存区加载和卸载数据。以下功能适用于与 S3 兼容的存储:
使用 COPY INTO <table> 命令批量加载数据。
例如,将位于桶中
load
子路径中的所有文件以及名为my_s3compat_stage
的暂存区中定义的路径的数据加载到表t1
中:COPY INTO t1 FROM @my_s3compat_stage/load/;
-
有关示例程序,请参阅 选项 1:使用 Snowpipe REST API 加载数据。
使用 COPY INTO <location> 命令卸载数据。
例如,将表
t2
中的数据卸载到桶中unload
子路径中的文件中,以及名为my_s3compat_stage
的暂存区中定义的路径中:COPY INTO @my_s3compat_stage/unload/ FROM t2;
使用外部表扩展数据湖¶
您可以使用具有与 S3 兼容的存储的外部表来查询数据,而无需先将其加载到 Snowflake 中。本节简要介绍如何创建和查询外部表,该表引用为兼容 S3 的存储所配置的外部暂存区上的位置。
首先,使用 CREATE EXTERNAL TABLE 创建一个外部表,该表引用与 S3 兼容的外部暂存区。
备注
无法自动刷新这些外部表的元数据。不支持 AUTO_REFRESH = TRUE
参数设置。您必须通过执行 ALTER EXTERNAL TABLE ...REFRESH 命令才能注册任何添加或移除的文件。
以下示例创建一个名为 et
的外部表,该表引用名为 my_s3compat_stage
的暂存区中的 path1
子路径。path1
子路径中的文件采用 Apache Parquet 格式。
CREATE EXTERNAL TABLE et
LOCATION=@my_s3compat_stage/path1/
AUTO_REFRESH = FALSE
REFRESH_ON_CREATE = TRUE
FILE_FORMAT = (TYPE = PARQUET);
为兼容 S3 的存储创建外部表后,可以对其进行查询。例如,查询之前创建的外部表中的 value
列:
SELECT value FROM et;
查询性能因网络和应用程序或设备性能而异。如果性能至关重要,建议在外部表上创建 物化视图。
供应商支持与 S3 兼容的存储¶
您可以将设备或应用程序(具有与 S3 兼容的 API )与 Snowflake 搭配使用。但是,存储服务提供商负责确保合规性。
以下供应商已向 Snowflake 表示,他们至少测试了部分产品,并发现它们可以与 Snowflake 结合使用:
Backblaze
Cloudflare
Cloudian
Cohesity
Dell
Hitachi Content Platform
IBM Storage Ceph
IDrive e2
MinIO
NetApp (StorageGRID)
Nutanix
PureStorage
Scality
Wasabi
此列表仅为方便起见而提供。Snowflake 不会测试外部产品以验证兼容性,也无法修复第三方供应商销售的产品中的问题。如果您对装有 S3 API 的硬件或软件是否或如何与 Snowflake 搭配使用有疑问,建议您直接联系供应商。
测试与 S3 兼容的 API¶
如果您是创建了与 S3 兼容的 API 的硬件或软件开发人员,可以使用 公共测试套件 (https://github.com/snowflakedb/snowflake-s3compat-api-test-suite) (在 GitHub 中)来测试 S3 API 是否适用于 Snowflake。该测试套件会查找您的实现与 Snowflake 对 S3 的期望之间明显不匹配的情况。但是,在某些情况下,测试可能无法识别不兼容性。
如果您是客户,并且想要测试自己的设备,建议联系供应商以运行这些测试。您还可以在设备上运行这些公共测试来评估兼容性。