从 S3 到 Snowflake 和性能

From S3 to Snowflake and performance

我将大量事件作为 JSON 小文件存储在 S3 中。现在我需要使用 Snowpipes 将这些文件提取到 Snowflake 中。发送到 Snowflake 的请求数量是否存在性能问题?我要不要把这些小文件合并成一个更大的 JSON 然后让 Snowflake 摄取它?

我知道 Snowflake 可以自动检测 S3 上的变化并尝试刷新其外部表,但我是否应该让小文件不断触发此过程?

Snowflake 有一些文档可以很好地回答这个问题 here。简而言之:理想情况下,您的文件很大,但又不会大到 and/or 复杂到需要一分多钟才能处理的程度。

我有一些 snowpipes 可以毫不费力地处理很多小文件,但您可能至少会从较大的文件中获得更好的性能。一般来说,SnowFlake 针对更大的批次进行了优化。

另一个注意事项是 Snowpipe pricing 包括加载的文件数量,因此您可能希望通过将小文件合并在一起来节省一些成本。

是的,API 请求的数量有限制。此速率存在于帐户级别,而不是用户或管道级别。每个端点都有自己的令牌库。

loadHistoryScan:

Starts with 20,000 tokens.
1 token consumed per call
5 refilled for each ingested file
1 refilled each minute


摄取文件:

Starts with unknown
1 token consumed per file
15,000 refilled each minute

对于 ingestFile 端点,在您的 API 调用中,每个 file 使用 1 个令牌,这是否正确您用一个文件提交 5000 个调用,或者用 5000 个文件提交一个调用。

重要的是不要重新提交相同的文件,因为您将为每个重新提交的文件消耗一个令牌,但是 copy_history table 函数不会告诉您管道是否已跳过一个文件。


insertReport:

Starts with unknown
1 token consumed per call
Refill rate unknown


一个账户随时可以拥有的代币数量上限为100,000;一旦你到达这一点,补充就会停止,直到你开始拨打 API 电话并再次使用代币。

Snowflake 建议加载的文件大小在 10 MB 到 100 MB 之间 compressed。如果您的要求允许您有时间将这些小文件合并为一个更大的文件,那么是的,我会推荐这种方法。