Snowpipe Streaming 最佳实践

成本优化

作为最佳实践,对于每秒写入较多数据的 Snowpipe Streaming 客户端,我们建议减少此类客户端的 API 调用。使用 Java 或 Scala 应用程序汇总来自多个来源(例如 IoT 设备或传感器)的数据,然后使用 Snowflake Ingest SDK 调用 API,从而以更高的流速率加载数据。API 可以高效地汇总账户中多个目标表的数据。

一个 Snowpipe Streaming 客户端可以打开多个通道来发送数据,但客户端成本仅按每个活动客户端收取。通道数量不影响客户端成本。因此,我们建议每个客户端使用多个通道来优化性能和成本。

由于预占文件迁移操作的缘故,使用相同的表进行批处理和流式数据引入也可以降低 Snowpipe Streaming 计算成本。如果在 Snowpipe Streaming 正插入到的同一个表上也启用了 自动群集,则文件迁移的计算成本可能会降低。群集操作将在同一事务中优化和迁移数据。

性能建议

为了在高吞吐量部署中实现最佳性能,我们建议采取以下措施:

  • java.time 包中,将 TIME、DATE 和所有 TIMESTAMP 列的值作为 支持的类型 之一传递。

  • 使用 OpenChannelRequest.builder 创建通道时,将 OnErrorOption 设置为 OnErrorOption.CONTINUE,然后手动检查 insertRows 的返回值,以了解是否可能存在引入错误。与依赖使用 OnErrorOption.ABORT 时引发的异常相比,这种方法目前可以带来更好的性能。

  • 将传给 insertRows 的每行批次的大小保持在 16 MB 以下。

  • 如果要加载多行,则使用 insertRows 将比多次调用 insertRow 更具性能和成本效益,因为用在锁上的时间更少。

  • 将默认日志级别设置为 DEBUG 时,请确保以下日志记录器继续在 INFO 级别记录日志:它们的 DEBUG 输出非常冗长,这可能导致性能显著下降。

    • net.snowflake.ingest.internal.apache.parquet

    • org.apache.parquet

延迟建议

在 Snowflake Ingest SDK 2.0.4 及更高版本中,您可以使用 MAX_CLIENT_LAG 配置数据刷新延迟。默认情况下,Snowpipe Streaming 每 1 秒刷新一次数据。通过 MAX_CLIENT_LAG 配置,可以替换刷新延迟,将其设置为所需值,值的范围从 1 秒到 10 分钟。

对于生成的数据不多的低吞吐量场景,可能每秒只发送 1 行或 1 KB 的数据。这可能会导致查询编译时间延长,因为必须解析大量小分区才能返回查询结果,尤其是在迁移过程压缩分区之前触发查询时。如果将 MAX_CLIENT_LAG 设置为较高的值,Snowpipe Streaming 可在配置的时间内缓冲插入的行,并创建更大的分区。这对查询性能和迁移有很大帮助。

因此,请将 MAX_CLIENT_LAG 设置为目标延迟所允许的最大值。例如,如果您有一个每 1 分钟运行一次的任务来合并或转换流式数据,则最好将 MAX_CLIENT_LAG 设置为 50 或 55 秒。

语言: 中文