Redshift 插入瓶颈

Posted

技术标签:

【中文标题】Redshift 插入瓶颈【英文标题】:Redshift insert bottleneck 【发布时间】:2015-11-25 14:38:27 【问题描述】:

我正在尝试将一个巨大的表从 postgres 迁移到 Redshift。

    表格大小约为5,697,213,832

    工具:pentaho Kettle 表输入(来自 postgres)-> 表输出(Redshift)

    与 Redshift JDBC4 连接

通过观察,我发现插入 Redshift 是瓶颈。只有大约 500 行/秒。

有没有什么方法可以加快单机模式下插入 Redshift 的速度?喜欢使用JDBC参数吗?

【问题讨论】:

【参考方案1】:

您是否考虑过使用 S3 作为中间层?

将您的数据转储到 csv 文件并应用 gzip 压缩。将文件上传到 S3,然后使用copy 命令加载数据。

http://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html

【讨论】:

好主意,只是想知道是否有其他方法可以将数据加载到 Redshift。像多线程插入到 Redshift 中 我认为这是最快的方式。在我的情况下,转换和加载 5M 记录 = 每秒 20.000 行需要 这是根据 redshift 文档加载表格的最有效方式:docs.aws.amazon.com/redshift/latest/dg/t_Loading_data.html redshift 是一种列式数据库技术,它不是为 OLTP 样式的单行插入而设计的。我已经使用这个产品超过 4 年了,相信我,当我说使用 COPY 批量加载是加载大量数据的最快和正确的方法时。 Gzipping 也有助于降低 S3 成本【参考方案2】:

我认为 Redshift 性能瓶颈的主要原因是 Redshift 将集群的每一次命中都视为一个查询。它在其集群上执行每个查询,然后进入下一个阶段。现在,当我跨多行发送(在本例中为 10 行)时,每行数据都被视为一个单独的查询。 Redshift 会一个一个地执行每个查询,并在执行完所有查询后完成数据的加载。这意味着如果您有 1 亿行,那么您的 Redshift 集群上将运行 1 亿个查询。好吧,性能转储了!!!

PDI 中使用 S3 File Output 步骤会将您的数据加载到 S3 存储桶,然后在 redshift 集群上应用 COPY 命令以将相同的数据从 S3 读取到 Redshift。这将解决您的性能问题。

您也可以阅读以下博客链接:

    Loading data to AWS S3 using PDI Reading Data from S3 to Redshift

希望这会有所帮助:)

【讨论】:

作为附录,如果您可以在 S3 上将输出拆分为单独的文件,那么您可以使用清单工具来并行化您的负载。 docs.aws.amazon.com/redshift/latest/dg/…【参考方案3】:

最好将数据导出到 S3,然后使用 COPY 命令将数据导入 Redshift。这样,导入过程很快,而您无需对其进行真空处理。

【讨论】:

【参考方案4】:

将您的数据导出到 S3 存储桶并在 Redshift 中使用 COPY 命令。 COPY 命令是在 Redshift 中插入数据的最快方法。

【讨论】:

以上是关于Redshift 插入瓶颈的主要内容,如果未能解决你的问题,请参考以下文章

Redshift 插入多行

使用 Python 将数据插入 RedShift

Redshift - 插入身份列

我可以在 RedShift 中创建快速插入暂存表吗?

批量插入的 Redshift 查询队列使用情况

如何使用 redshift 上的函数插入表格