当前位置:  开发笔记 > 数据库 > 正文

AWS Redshift JDBC插入性能

如何解决《AWSRedshiftJDBC插入性能》经验,为你挑选了1个好方法。

我正在编写一个概念验证应用程序,旨在以每秒约1000条消息的速率获取实时点击流数据,并将其写入Amazon Redshift.

我正在努力获得其他人声称的表现(例如,这里).

我正在运行一个带有2个dw.hs1.xlarge节点(+ leader)的集群,正在执行加载的机器是与运行64位Ubuntu 12.04.1的Redshift集群在同一VPC上的EC2 m1.xlarge实例.

我正在使用Java 1.7(来自Ubuntu repos的openjdk-7-jdk)和Postgresql 9.2-1002驱动程序(主要是因为它是Maven Central中唯一一个使我的构建更容易!).

我已经尝试了这里显示的所有技术,除了最后一个.

我无法使用,COPY FROM因为我们想要"实时"加载数据,因此通过S3或DynamoDB进行暂存不是一个真正的选择,Redshift不支持COPY FROM stdin某些原因.

以下是我的日志摘录,显示每个行以大约15 /秒的速率插入:

2013-05-10 15:05:06,937 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 170
2013-05-10 15:05:18,707 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done
2013-05-10 15:05:18,708 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 712
2013-05-10 15:06:03,078 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done
2013-05-10 15:06:03,078 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Beginning batch of 167
2013-05-10 15:06:14,381 [pool-1-thread-2] INFO  uk.co...redshift.DatabaseWriter - Done

我究竟做错了什么?我可以采取哪些其他方法?



1> Joe Harris..:

Redshift(又名ParAccel)是一个分析数据库.目标是使分析查询能够在非常大量的数据上快速得到解答.为此,Redshift以列式格式存储数据.每列单独保存,并根据列中的先前值进行压缩.这种压缩往往非常有效,因为给定的列通常包含许多重复和类似的数据.

这种存储方法在查询时提供了许多好处,因为只需要读取请求的列并且要读取的数据被非常压缩.然而,这样做的成本是插入件往往更慢并且需要更多的努力.此外,未完全排序的插入可能导致查询性能较差,直到表为VACUUM.

因此,通过一次插入一行,您将完全违背Redshift的工作方式.数据库必须连续将数据附加到每个列并计算压缩.它有点(但不完全)就像为大量的zip存档添加单个值.此外,即使在插入数据后,在运行VACUUM重新组织表之前,仍然无法获得最佳性能.

如果您想"实时"分析数据,那么出于所有实际目的,您应该选择其他数据库和/或方法.我的头顶是3:

    接受"小"批处理窗口(5-15分钟)并计划至少每天运行VACUUM.

    选择一个分析数据库(更多$)来处理小插入,例如Vertica.

    尝试允许单路径分析的"NoSQL"DB,例如,Acunu Cassandra.


正如我所提到的 - 从S3加载时我已经看到高达10万行/秒.我发现很难相信存在如此大的差异.我的意思是 - 如果你说我可以从CSV/S3做100k行/秒,但是通过SQL INSERT语句只能达到20k /秒,我会对这种差异感到震惊.但是100k vs 15只是没有任何逻辑意义!
推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有