Snowpipe¶
当暂存区中提供文件时,Snowpipe 可以立即加载文件中的数据。这意味着您可以微批量地加载文件中的数据,使其在几分钟内可供用户使用,而不是按计划手动执行 COPY 语句来加载较大批的数据。
本主题内容:
Snowpipe 如何运行?¶
当暂存区中提供文件时,Snowpipe 会立即加载文件中的数据。按照引用的管道中定义的 COPY 语句加载数据。
管道是一个命名的、出色的 Snowflake 对象,其中包含 Snowpipe 使用的 COPY 语句。COPY 语句标识数据文件的源位置(即暂存区)和目标表。支持所有数据类型,包括半结构化数据类型,例如 JSON 和 Avro。
可以使用不同的机制来检测暂存文件:
使用云消息传递实现 Snowpipe 自动化
自动数据加载利用云存储的事件通知来告知 Snowpipe 要加载的新数据文件已到达。Snowpipe 从队列中轮询事件通知。通过使用队列中的元数据,Snowpipe 根据指定管道对象中定义的参数,以连续、无服务器形式将新数据文件加载到目标表中。
调用 Snowpipe REST 端点
客户端应用程序使用管道对象的名称和数据文件名列表调用公共 REST 端点。如果在管道对象所引用的暂存区中发现与列表匹配的新数据文件,这些新数据文件会排队等待加载。Snowflake 提供的计算资源会根据管道中定义的参数将数据从队列加载到 Snowflake 表中。
支持的云存储服务¶
下表显示了云存储服务支持,从托管在每个 云平台 上的 Snowflake 账户,自动执行 Snowpipe 和 Snowpipe REST API 调用:
Snowflake 账户主机 |
Amazon S3 |
Google Cloud Storage |
Microsoft Azure Blob 存储 |
Microsoft Data Lake Storage Gen2 |
Microsoft Azure General-purpose v2 |
---|---|---|---|---|---|
Amazon Web Services |
✔ |
✔ |
✔ |
✔ |
✔ |
Google Cloud Platform |
✔ |
✔ |
✔ |
✔ |
✔ |
Microsoft Azure |
✔ |
✔ |
✔ |
✔ |
✔ |
有关更多信息,请参阅 使用云消息传递自动进行连续数据加载 和 用于加载数据的 Snowpipe REST 端点概述。
请注意,云提供商的政府区域不允许向其他商业区域发送事件通知或从其他商业区域发送事件通知。有关更多信息,请参阅 AWS GovCloud (US) (https://docs.aws.amazon.com/govcloud-us/latest/UserGuide/govcloud-s3.html) 和 Azure Government (https://learn.microsoft.com/en-us/azure/azure-government/)。
重要
Snowflake 建议您为 Snowpipe 启用云事件筛选,以降低成本、事件噪音和延迟。有关为每个云提供商配置事件筛选的更多信息,请参阅以下页面:
使用对象键名称筛选配置事件通知 – Amazon S3 (https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-filtering.html)
了解事件网格订阅的事件筛选 – Azure (https://docs.microsoft.com/en-us/azure/event-grid/event-filtering)
筛选消息 – Google Pub/Sub (https://cloud.google.com/pubsub/docs/filtering)
Snowpipe 与批量数据加载有何不同?¶
本节简要介绍 Snowpipe 与使用 COPY 命令的批量数据加载工作流程之间的主要区别。Snowpipe 文档中提供了更多详细信息。
身份验证¶
- 批量数据加载:
依赖客户端支持的安全选项来验证和启动用户会话。
- Snowpipe:
当调用 REST 端点时: 需要使用 JSON 网络令牌 (JWT) 进行密钥对身份验证。JWTs 使用通过 RSA 加密的公钥/私钥对签名。
加载历史记录¶
- 批量数据加载:
在目标表的元数据中存储 64 天。COPY 语句完成后,可用作语句输出。
- Snowpipe:
在管道的元数据中存储 14 天。必须通过 REST 端点、 SQL 表函数或 ACCOUNT_USAGE 视图从 Snowflake 提出请求。
重要
为了避免重新加载文件(和重复数据),建议使用以下 任一 方式从一组特定文件加载数据:批量数据加载或 Snowpipe,但两者不能同时使用。
事务¶
- 批量数据加载:
始终在单个事务中执行加载。可以将数据与用户手动提交的任何其他 SQL 语句一起插入表中。
- Snowpipe:
根据每个数据文件中的行数和大小,将负载合并为单个事务或拆分为多个事务。部分加载的文件行(基于 ON_ERROR copy 选项设置)也可以合并为单个事务或拆分为多个事务。
计算资源¶
- 批量数据加载:
需要用户指定的仓库来执行 COPY 语句。
- Snowpipe:
使用 Snowflake 提供的计算资源。
成本¶
- 批量数据加载:
为每个虚拟仓库处于活动状态的时间量计费。
- Snowpipe:
根据加载文件时 Snowpipe 仓库中使用的计算资源进行计费。
建议加载文件大小¶
为了使用 Snowpipe 获得更高效和更具成本效益的加载体验,建议遵循 文件大小调整最佳实践和限制 中的文件大小建议,并且每分钟暂存一次文件。这种方法通常可以在成本(即用于 Snowpipe 队列管理和实际负载的资源)和性能(即负载延迟)之间实现良好的平衡。有关更多信息,请参阅 连续数据加载(即 Snowpipe)和文件大小调整 。
数据文件的加载顺序¶
对于每个管道对象,Snowflake 会建立一个队列来对等待加载的数据文件进行排序。在暂存区中发现新的数据文件时,Snowpipe 会将它们追加到队列中。然而,多个进程会从队列中拉取文件;因此,虽然 Snowpipe 通常先加载较旧的文件,但不能保证文件的加载顺序与暂存顺序相同。
数据重复¶
Snowpipe 使用与每个 管道对象 关联的文件加载元数据,以防止重新加载表中的相同文件(和复制数据)。该元数据存储每个加载文件的路径(即前缀)和名称,并防止加载具有相同名称的文件,即使这些文件后来进行了修改(即具有不同的 eTag)。
估计 Snowpipe 延迟¶
考虑到可以区分 Snowpipe 负载的因素有很多,Snowflake 很难估计延迟。文件格式和大小以及 COPY 语句(包括用于转换的 SELECT 语句)的复杂性都会影响 Snowpipe 加载所需的时间量。
建议您通过执行一组典型的负载进行实验来估计平均延迟。
管道安全¶
访问控制权限¶
创建管道¶
创建和管理管道需要至少具有以下权限的角色:
对象 |
权限 |
备注 |
---|---|---|
数据库 |
USAGE |
|
架构 |
USAGE、CREATE PIPE |
|
管道定义中的暂存区 |
USAGE |
仅限外部暂存区。 |
管道定义中的暂存区 |
READ |
仅限内部暂存区。 |
管道定义中的表 |
SELECT、INSERT |
拥有管道¶
创建管道后,管道所有者(即拥有管道的 OWNERSHIP 权限的角色)必须具有以下权限:
对象 |
权限 |
备注 |
---|---|---|
数据库 |
USAGE |
|
架构 |
USAGE |
|
管道 |
OWNERSHIP |
|
管道定义中的暂存区 |
USAGE |
仅限外部暂存区。 |
管道定义中的暂存区 |
READ |
仅限内部暂存区。 |
管道定义中的表 |
SELECT、INSERT |
暂停或恢复管道¶
除了管道所有者之外,具有以下最低权限的角色也可以暂停或恢复管道:
对象 |
权限 |
备注 |
---|---|---|
数据库 |
USAGE |
|
架构 |
USAGE |
|
管道 |
OPERATE |
|
管道定义中的暂存区 |
USAGE |
仅限外部暂存区。 |
管道定义中的暂存区 |
READ |
仅限内部暂存区。 |
管道定义中的表 |
SELECT、INSERT |
Snowpipe DDL¶
为了支持创建和管理管道,Snowflake 提供了以下一组特殊 DDL 命令:
此外,提供商可以使用以下标准访问控制 DDL,来查看、授予或撤消对 Snowpipe 所需数据库对象的访问权限: