Snowflake 多集群仓库性能 vs 大仓库规模的单仓库

Posted

技术标签:

【中文标题】Snowflake 多集群仓库性能 vs 大仓库规模的单仓库【英文标题】:Snowflake multi-cluster warehouse performance vs single warehouse with large warehouse size 【发布时间】:2021-08-30 08:41:41 【问题描述】:

我对 Snowflake 非常陌生,在使用 Snowflake 时,我在以下 2 个选项之间遇到了冲突。

    大小为X-Large的单一仓库(16 学分/小时) 多集群(ma​​x clusters=2 & min clusters=2),大小Large(8 积分/小时)李>

考虑以上 2 个选项 就性能而言,选择第二个选项有什么优势吗?

注意:我知道多集群相对于单个仓库的优势。请分享您对这个特定场景的答案(当 min = max 时)。

【问题讨论】:

在这两个选项中,您消耗相同的积分。不同之处在于单个集群与多集群相比,您说“您知道多集群相对于单个仓库的优势”。在这种情况下,你知道答案,对吧?您的意思是“您知道自动扩缩比多 WH 和单 WH 的优势”吗? @Gokhan Atil,我的主要问题是——在这两种情况下都会有任何与性能相关的影响 答案是肯定的 【参考方案1】:

所以运行查询时发生的事情是。

我将只使用single 表示单个实例,使用“multi”表示多实例集群,当我们运行查询时,它只会在一个实例上。

从存储层读取\写入 IO:

这里单的 IO 是多的两倍,因此如果您的查询是 IO 饱和的,那么单是更好的选择。

并行步骤:

因此,如果您在高基数列上有 GROUP BY,则单列和多列应该同样好。如果您的基数较低但有数十亿行,则较小的实例可能会产生更好的结果,因为这些复杂的步骤无法在单个实例的较大集群大小上被打破。但是,如果您有许多并发查询,这很可能会丢失。

许多查询/嘈杂的邻居:

如果您有数百个查询在波中遇到,则较大的单个实例在启动这些查询时会更糟糕,因为它一次只有较少的并发任务,并且单个非常大的查询可以刷新缓存或仅支配集群,这意味着您停止处理普通/小型查询。如果只有一个“超重”查询进入,那么如果拥有 mutli 集群,您只会停止正常查询的一半。

其他想法 这也真的取决于你的负载模式,在我的上一份工作中,我们有自动缩放的 SMALL 实例集群,用于回答我们对仪表板、报告的读取查询,我们允许它运行有点过度配置,所以事情是活泼。 当我们的数据加载在第二个自动扩展的 MEDIUM 实例集群上运行时,我们故意超载,因为我们试图以最快/最便宜的速度加载数据。在非高峰时间,我们以编程方式减少自动缩放 MAX 以几乎使负载饿死。但是会通过在“半夜”中节省的积分对 LARGE 实例进行一些昂贵的重新处理,而且我们的加载任务能够启动专有的 LARGE+ 大小的仓库来进行一次性重建,因为这都是 IO 绑定的工作,因此“中断”窗口越小系统越好,IO规模线性,所以总成本是一样的。

总而言之,“什么是最好的”实际上取决于您所做的事情、您的预算以及您准备的权衡取舍。雪花的黄金之处在于它不像经典的数据库,您必须选择尺寸并正确设置,选择一个并观察它,如果它正在努力改变它。当我们的代码或雪花的发布改变了一些关键 SQL 的性能时,我们多次这样做,我们会跳进去,将实例计数或大小增加一倍或三倍以克服这种情况,同时尝试修复或解决 SF 问题,或等待 SF 回滚版本。几个小时通常花费更多的学分不是预算制动。这种灵活性还意味着您可以进行实验,“如果我们尝试 4 倍更小的实例会发生什么......”“哦,没什么......看起来我们只是节省了大量资金”......

【讨论】:

【参考方案2】:

如果您有 min=max=2,那么您将永久拥有 2 个正在运行的仓库(只要它们没有被暂停)。如果您像这样配置多集群仓库,那么您将失去很多优势,但对于您的特定用例,我想这可能是有意义的

【讨论】:

在性能方面会不会有什么不同..? XL 可能会更快地处理任何单个 SQL 语句。两个L仓大概处理大量SQL会更快【参考方案3】:

根据您的评论,这是我的回答:

在这两种情况下,您将拥有相同的资源来处理您的查询。重要的区别在于运行单个繁重的查询。您可能知道,单个查询不能生成到多个集群(目前),因此当您在多集群仓库中运行查询时,它将在大型仓库之一上处理(并使用最多 8 个节点)。

如果您在单个 XL 仓库上运行相同的查询,它可以由(最多)16 个节点执行。因此,如果您要运行需要更多内存和 CPU 的繁重查询,则使用单个 XL 仓库会更好。

关于并发,有一个参数叫“MAX_CONCURRENCY_LEVEL”。它的默认值为 8,它限制了每个仓库的最大并发执行数。如果不改的话,你的单个 XL 仓库最多并发执行 8 个查询,而你的多集群仓库可以并发执行 16 个查询。

https://docs.snowflake.com/en/sql-reference/parameters.html#max-concurrency-level

你可以增加这个参数,在单 XL 和多集群 L 仓库上提供相同的并发。但是在这种情况下,同时运行繁重和轻量查询时应该小心。因为一个查询可能会占用仓库的大部分资源,而您的轻量查询可能资源较少,耗时较长。因此,如果您将有“相对”轻量/并发查询,我建议您使用多集群仓库。

【讨论】:

以上是关于Snowflake 多集群仓库性能 vs 大仓库规模的单仓库的主要内容,如果未能解决你的问题,请参考以下文章

在 Snowflake 中,仓库配置是如何发生的

如何自动向上/向下调整雪花仓库的大小?

建模方法论数据仓库系列03

Snowflake 中对非常大的表进行删除操作的最佳方法是啥?

Snowflake:有没有不使用就可以创建仓库的方法?

在存储过程中创建 Snowflake 仓库会更改当前仓库