【问题标题】:Redshift cluster bigger because of running query由于运行查询,Redshift 集群更大
【发布时间】:2018-02-20 11:19:35
【问题描述】:

由于查询运行了 100 多个小时,在 Aginity 中,我们看到我们的集群大小从 1 TB 变为 5 TB。

通过检查 svv_table_info,我们发现每个表的大小比我们过去看到的要大得多。之后,我们检查了 AWS 控制台,我们看到大小增加是在 5 天前开始的,同时 100 小时运行查询已经开始。

杀死查询后,Redshift 大小恢复到 1 TB 后几分钟,每个表大小恢复正常。

为什么会这样?

仅作记录,运行 100 小时的查询并未涉及在查询运行时大小急剧增加的所有表。

已编辑

我现在无法真正重现该错误。但步骤如下:

  • 在 Aginity 中,我无意中看到集群的大小为 5TB,即使集群只有 2 个 ds2.xlarge 节点(总共 4TB)

  • 我查询 svv_table_info 以获取每个表的大小 - 它们的总和为 5TB,我发现它们中的大多数看起来都大得惊人

  • 我看到 DWH 拥有所有最新数据,尽管“据报道”它已满至少 2 天(它的大小也超过 4TB)

  • 我看到一个运行了 100 多个小时的查询,其中一位数据分析师留下了一个打开的笔记本。查询没有涉及到所有看起来大得不合理的表

  • 我终止查询,片刻后一切恢复正常

所以: - 如果我们只有 2x2TB = 4TB 的可用空间,Redshift 怎么可能增长到 5TB!

【问题讨论】:

  • 当同样的事情发生在我身上时,我的查询中有一个错误,它产生了一个大表的笛卡尔积,因此 n 平方行数......这会溢出到磁盘。仔细检查您的加入条件
  • 您假设 svv_table_info 中的表大小反映了磁盘上的实际大小,但这并不总是正确的。总表大小可能看起来 > 4TB,但这是由于 svv_table_info 计算表大小的方式,这是近似值。不管 svv_table_info 告诉你什么,你只有 4TB 的磁盘。集群大小没有“从 1TB 变为 5TB”——集群大小始终为 4TB(在这种情况下)。您正在查看的是 已使用百分比 磁盘空间,您最初使用的大约是 25%,然后运行这个大查询时使用率上升到 100%。

标签: amazon-redshift


【解决方案1】:

这也发生在我们身上。 Redshift 在运行查询时会占用磁盘空间,这就是为什么当您终止查询时集群大小会恢复正常。

这是一篇关于 https://www.periscopedata.com/blog/disk-based-temporary-tables 的非常好的文章

【讨论】:

  • 是的,但这真的能解释所有事情吗?
  • 没有看到的查询真的很难理解那里发生了什么。
  • 完全正确 - 这似乎没有意义。 @srdjan,你能详细说明一下吗?
  • @JonScott 您可以看到我在问题底部所做的步骤。
【解决方案2】:

首先区分 Amazon Redshift 在查询执行期间如何使用存储可能会有所帮助。有两种方法:

  1. 基于磁盘的查询。当查询耗尽内存时,溢出“溢出”到磁盘,查询变为“基于磁盘”。
  2. 中间存储。当查询需要保存中间操作的结果以用作未来操作的输入时。

在这种情况下,我认为您正在考虑使用中间存储。无论查询计算什么,它都开始用中间结果填满磁盘。当一个查询连接两个非常大的表(例如,每个表有数十亿行)时,这种情况经常发生,通常由没有编写 OLAP 查询经验的人编写。 5TB 的绝对数量与使用的磁盘空间百分比相关性较小,在您的情况下为 100%。

我们已经写了一篇关于如何修复基于磁盘的查询的文章,这里详细介绍了 Redshift:https://www.intermix.io/blog/how-to-fix-disk-based-queries-amazon-redshift/

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多