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 秒。