将大型数据集从 Redshift 卸载到 S3 失败并出现 I/O 错误

Posted

技术标签:

【中文标题】将大型数据集从 Redshift 卸载到 S3 失败并出现 I/O 错误【英文标题】:Unloading large data set from Redshift to S3 fails with I/O error 【发布时间】:2014-07-25 22:44:02 【问题描述】:

我真正想要完成的是更改几列的数据类型。特别是一些作为字符串存储的列,这些列需要是日期。我试图使用具有类似问题的 CREATE TABLE / SELECT 命令。 I/O 错误或连接中断。

我认为导出和重新导入数据可能比试图通过或多或少地读取/写入如此多的数据来滥用集群更有效。

我已经尝试了配置大超时(10 小时)的 Aginity Workbench 和 SQL Workbench J。 SQL Workbench J 今天成功运行了 2 小时 12 分钟,然后由于我一遍又一遍地看到的相同错误而失败。

发送到后端时发生 I/O 错误。

这是相当大的数据...目前有 2,028,448,405 行(我说“目前”是因为我们每天要添加大约 7000 万行)。但我希望 Redshift 能够轻松处理这个问题。

UNLOAD ( 'select weekday, day, month, year, guid,

 ...,

      科尔N
  从动作 a
  其中 a.colN in (\'my\',\'penguin\',\'lolz\')'
)
TO 's3://penguin-lolz-bucket/all.csv'
凭证 'aws_access_key_id=$id;aws_secret_access_key=$key
允许覆盖;

谷歌搜索错误消息让我看到了大量关于超时配置或一般连接问题的帖子。

更新 1:

所以做了一些更改,到目前为止查询已经运行了 3 个小时没有错误:

    从 TO 字段中删除了文件名 专门为此进程创建了一个新存储桶 向查询中添加了 GZIP 和 PARALLEL 选项

这是基于我可能超出存储桶容量和/或每个文件的最大对象大小的想法。

更新 2: UNLOAD 现在按预期执行。 (在我在 UPDATE 1 中所做的更改之后)

专业提示:像这样进行大量卸载时,请密切注意 AWS Redshift 控制台中的查询状态(当您执行深入了解您的集群详细信息)。我为此使用了 SQL Workbench J。大约 5 小时后,SQL Workbench J 显示查询仍在运行。然而,AWS Redshift 控制台显示它已完成,而且确实如此。

【问题讨论】:

感谢您指定您使用的是 Redshift。这意味着我不能真正帮助你,但希望其他人会。我认为 AWS 论坛上的 Redshift 比 Stack Overflow 更受关注。 是否有SQL状态和错误信息一起抛出? 不,消息中不包含 SQL 状态。我正在使用我不熟悉的 SQL Workbench J。我会检查是否有办法从错误消息中获取更多信息。不幸的是,查询再次失败需要 2 个小时左右。这是一个相当缓慢的测试周期。 您始终可以使用 STV_RECENTS 表查看正在运行的状态查询,并查看 STV_INFLIGHT 表以查看查询是实际运行还是等待 15 个插槽之一。 【参考方案1】:

这是由于您的查询需要很长时间并且 SQL Workbench 断开连接。

您可以使用 php 或 shell(使用 pgsql_connect)编写小脚本并使用您的卸载查询。

确保您在后台运行脚本。如果您从本地 PC 运行脚本,请确保它没有与网络断开连接。

其他选项是如果您有 EC2 实例在 EC2 上运行您的脚本。

【讨论】:

以上是关于将大型数据集从 Redshift 卸载到 S3 失败并出现 I/O 错误的主要内容,如果未能解决你的问题,请参考以下文章

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

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

将数据从 Amazon redshift 卸载到 Amazon s3

如何使用 aws unload 命令将数据从 AWS Redshift 卸载到 s3?

使用 Spectrify 以 Parquet 格式将数据从 Redshift 卸载到 S3

Redshift卸载到S3非常慢