【问题标题】:From S3 to Snowflake and performance从 S3 到 Snowflake 和性能
【发布时间】:2020-01-08 14:19:19
【问题描述】:
我有大量的事件以小型 JSON 文件的形式存储在 S3 中。现在我需要使用 Snowpipes 将这些文件摄取到 Snowflake 中。发送到 Snowflake 的请求数量是否存在性能问题?我应该将这些小文件合并成一个更大的 JSON,然后让 Snowflake 摄取它吗?
我知道 Snowflake 可以自动检测 S3 上的更改并尝试刷新其外部表,但我是否应该让小文件不断触发这个过程?
【问题讨论】:
标签:
performance
amazon-s3
snowflake-cloud-data-platform
data-ingestion
【解决方案1】:
是的,可以发出的 API 请求数量是有限制的。此比率存在于帐户级别,而不是用户或管道级别。每个端点都有自己的令牌库。
loadHistoryScan:
从 20,000 个令牌开始。
每次通话消耗 1 个令牌
为每个提取的文件重新填充 5 个
每分钟补充 1 次
摄取文件:
以unknown开头
每个文件消耗 1 个令牌
每分钟补充 15,000 个
对于 ingestFile 端点,您的 API 调用中的每个 file 使用 1 个令牌,无论您提交 5000 次调用和一个文件还是一个调用 5000 都是如此文件。
请务必不要重新提交相同的文件,因为您将为每个重新提交的文件使用一个令牌,但 copy_history 表函数不会告诉您管道是否跳过了文件。
插入报告:
以unknown开头
每次通话消耗 1 个令牌
充值率unknown
一个账户随时可以拥有的最大代币数量为100,000;一旦达到这一点,重新填充就会停止,直到您开始进行 API 调用并再次使用令牌。
Snowflake 建议加载的文件大小在 10 MB 到 100 MB 之间压缩。如果您的要求允许您有时间将这些小文件合并成一个更大的文件,那么是的,我会推荐这种方法。
【解决方案2】:
Snowflake 有一些文档可以很好地回答这个问题here。简而言之:理想情况下,您的文件很大,但不会大到和/或复杂到需要一分钟以上的时间来处理。
我有一些雪管可以轻松处理大量小文件,但您可能会从较大的文件中获得至少稍微更好的性能。一般来说,SnowFlake 针对大批量进行了优化。
另一个注意事项是Snowpipe pricing 包括加载的文件数量,因此您可能还希望通过将小文件合并在一起来节省一些成本。