Amazon Redshift 查询神秘死亡

Posted

技术标签:

【中文标题】Amazon Redshift 查询神秘死亡【英文标题】:Amazon Redshift queries mysteriously dying 【发布时间】:2015-09-17 11:35:23 【问题描述】:

为什么我的 Amazon Redshift 查询有时会工作,有时会被杀死,有时会耗尽内存?

这是一个简单的查询:

dev=# EXPLAIN SELECT row_number, browser_cookie, "timestamp", request_path,
                     status,     outcome,         duration,   referrer
       FROM annotated_apache_logs
      WHERE date = '2015-09-15';
                                         QUERY PLAN                                          
------------------------------------------------------------------------------------
 XN Seq Scan on annotated_apache_logs  (cost=0.00..114376.71 rows=9150137 width=207)
   Filter: (date = '2015-09-15'::date)

提取大约 900 万行:

dev=# SELECT count(*) FROM annotated_apache_logs WHERE date = '2015-09-15';
  count  
---------
 9150137
(1 row)

窒息:

dev=# SELECT row_number, browser_cookie, "timestamp", request_path,
             status,     outcome,        duration,    referrer
        FROM annotated_apache_logs
       WHERE date = '2015-09-15';
out of memory

有时 sql 会显示 Killed。有时它会起作用。有时我会收到out of memory。不知道为什么。该表如下所示(我已删除上述查询中没有的行):

CREATE TABLE IF NOT EXISTS annotated_apache_logs (
  row_number           double precision,
  browser_cookie       character varying(240),
  timestamp            integer,
  request_path         character varying(2500),
  status               character varying(12),
  outcome              character varying(128),
  duration             integer,
  referrer             character varying(2500)
)
DISTKEY (date)
SORTKEY (browser_cookie);

我非常努力地使所有这些列尽可能小,以减少内存使用量。我现在要寻找什么?如果我正确读取了EXPLAIN 输出,这可能会返回一些数据。没有太多数据,没有连接,没有什么花哨的。对于“PB 级数据仓库”来说,这是微不足道的,所以我假设我在这里遗漏了一些基本的东西。

【问题讨论】:

【参考方案1】:

您应该使用游标以块的形式获取结果集。见http://docs.aws.amazon.com/redshift/latest/dg/declare.html

如果您的客户端应用程序使用 ODBC 连接并且您的查询创建了一个太大而无法放入内存的结果集,您可以使用游标将结果集流式传输到您的客户端应用程序。当您使用游标时,整个结果集都会在领导节点上具体化,然后您的客户端可以逐步获取结果。

编辑: 假设您想要整个结果集而不是使用 where/limit 进行过滤。

【讨论】:

【参考方案2】:

如果您的查询实际上内存不足,请检查运行此查询的 WLM 队列的并发性。尝试增加此队列的可用内存或减少并发,这将使您的查询拥有更多内存。

附注: 当它说“PB 级”时,并不意味着它有 PB 级的 RAM 供您使用。有很多因素决定了您的查询在执行时实际获得了多少内存, 您使用的节点类型是什么? 多少个节点? 当您运行此查询时,还有哪些其他查询正在运行?

【讨论】:

我很尴尬地说它原来是一个客户端限制。在调优查询和重新定义表方面做了大量工作,结果发现是客户端导致了错误消息,而不是 Redshift。 天哪。是的,我在写答案时想了一会儿,但没有添加。顺便问一下,编辑器是什么,你是如何修复它的? 我指的是“客户端”中的“客户端”,而不是“编辑器”。我的 AWS 沙盒无法处理 Redshift 发送的数据量。我需要增加沙盒的内存或在更强大的机器上运行查询。

以上是关于Amazon Redshift 查询神秘死亡的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Red Shift:如何在 SQL Server 中编写类似于存储过程的查询批处理

不使用 jdbc 驱动程序查询 Amazon Redshift

使用 Amazon Redshift / PostgreSQL 进行漏斗查询

在 Amazon Redshift 中按日期透视查询

查询缓存amazon redshift

在 Amazon Redshift 中使用 Diststyle ALL 的表应该有多小?