【问题标题】:Amazon Redshift queries mysteriously dyingAmazon Redshift 查询神秘死亡
【发布时间】: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 级数据仓库”来说,这是微不足道的,所以我假设我在这里遗漏了一些基本的东西。

【问题讨论】:

    标签: sql postgresql amazon-redshift


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

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