Redshift卸载到S3非常慢

Posted

技术标签:

【中文标题】Redshift卸载到S3非常慢【英文标题】:Redshift unload to S3 is extremely slow 【发布时间】:2017-01-15 23:05:12 【问题描述】:

我在美国西部使用 ds2.xlarge Redshift 集群,数据量约为 1TB。我正在尝试将 50GB 表卸载到同一区域中的 S3 存储桶,如下所示:

UNLOAD ('select * from table_name') TO 's3://bucket/folder_name/'
CREDENTIALS 'aws_access_key_id=foo;aws_secret_access_key=bar'
MANIFEST;

此查询大约需要 1 小时才能运行。这似乎令人惊讶,因为亚马逊网站说我们的集群将有 0.5GB/s 的 I/O,这意味着将 50GB 的表上传到 S3 需要不到 2 分钟,而不是一个小时。 (比宣传的慢 20-30 倍)

有没有其他人遇到过这个问题和/或找到了修复/解决方法?如果我们决定使用 Redshift,我们每天需要将大约 200GB 的数据从 Redshift 转移到 S3。

【问题讨论】:

集群中只有一个节点吗?表中有多少行和列?如果你做的数量较少(例如select * from table_name limit 10000),它完成得更快吗?只是出于兴趣,哪里提到集群的 0.5GB/s? 这里提到了I/O:aws.amazon.com/blogs/aws/…我相信该表大约有80M行和10-20列。有限制的话会快很多 我怀疑I/O列是数据库访问磁盘存储的速度,不一定是导出到Amazon S3的速度。导出完成速度更快且行更少的事实表明它与数据量有关。您可以尝试使用工作负载管理 (WLM) 为进程授予插槽(从而获得更多内存)。见:wlm_query_slot_count 另一个加快卸载速度的选项是压缩数据 (gzip / bzip2)。移动位需要花费大量时间,尤其是当存储桶与 Redshift 不在同一区域时。 docs.aws.amazon.com/redshift/latest/dg/r_UNLOAD.html 添加 PARELLEL TRUE 应该有助于提高性能,因为它会根据集群中的片数写入多个文件。默认情况下,Redshift 不使用此选项。 【参考方案1】:

对于 Redshift 来说,“重新实现”完整的行非常昂贵。这就是 S3 卸载比总磁盘 I/O 慢得多的原因。

数据以针对检索单个列进行了优化的方式存储在磁盘上。重新创建完整的行会(有效地)生成随机 I/O 访问。在基于 SSD 的节点类型上,您的卸载速度会快得多

如果您想验证这一点,您可以将所有列(分隔)写入一个包含 1 个 VARCHAR(MAX) 列的表中 - 这会非常慢。然后卸载该表 - 这会更快。

【讨论】:

以上是关于Redshift卸载到S3非常慢的主要内容,如果未能解决你的问题,请参考以下文章

从 Redshift 卸载到 S3 时 JDBC 连接丢失。应该发生啥?

递归地将数据从 redshift 卸载到 S3 存储桶

使用 Airflow 将数据从 Redshift 卸载到 S3

Redshift 卸载到 S3 位置,它是一个连接字符串

从 Redshift 卸载到 S3:身份验证不起作用

Amazon Redshift - 卸载到 S3 - 动态 S3 文件名