我有一个红移集群,用于一些分析应用程序。我有要添加到clicks表中的传入数据。假设我有10次新的“点击”,我想存储每秒钟。如果可能的话,我希望我的数据尽快在红移。
据我所知,由于柱状存储,insert性能很差,所以您必须按批插入。我的工作流程是将点击存储在redis中,每分钟,我都会将从redis到redshift的600次点击作为一个批处理插入。
我有两种方法可以将一批点击插入红移:
Multi-row insert strategy:我使用一个常规的insert查询来插入多个行。这里的多行插入文档S3 Copy strategy:我将s3中的行复制为clicks_1408736038.csv。然后运行一个COPY将其加载到clicks表中。在这里复制文件我已经做了一些测试(这是在一个已经有200万行的clicks表上完成的):
| multi-row insert stragegy | S3 Copy strategy |
|---------------------------+---------------------------+
| insert query | upload to s3 | COPY query |
-------------+---------------------------+--------------+------------+
1 record | 0.25s | 0.20s | 0.50s |
1k records | 0.30s | 0.20s | 0.50s |
10k records | 1.90s | 1.29s | 0.70s |
100k records | 9.10s | 7.70s | 1.50s |正如您所看到的,就性能而言,首先在s3中复制数据似乎一无所获。upload + copy时间等于insert时间。
问题:
每种方法的优点和缺点是什么?什么是最好的练习?我错过什么了吗?
另一个问题是:是否有可能通过清单自动将数据从COPY转移到s3?我的意思是,一旦新的COPYing文件被添加到s3中,就会立即将数据添加到s3中?这里和这里博士。还是我必须自己创建一个后台工作人员来触发复制命令?
我的快速分析:
在关于一致性的文档中,没有提到通过多行插入加载数据。看起来最好的方法是使用唯一的对象键从COPY进行s3 ( s3上的每个.csv都有自己的唯一名称)。
S3 Copy strategy:COPY命令的cron .)
Multi-row insert strategy insert查询
发布于 2014-08-31 17:25:10
Redshift是一种分析数据库,它被优化为允许您查询数以百万计的记录。它还被优化,允许您使用COPY命令非常快速地将这些记录摄取到Redshift中。
COPY命令的设计是将多个文件并行加载到集群的多个节点。例如,如果您有一个5个小节点(dw2.xl)集群,如果您的数据是多个文件数(例如,20个),您可以以10倍的速度复制数据。文件数量和每个文件中的记录数之间是平衡的,因为每个文件都有一些小开销。
这将使您在副本的频率(例如每5或15分钟,而不是每30秒)与事件文件的大小和数量之间取得平衡。
要考虑的另一点是所拥有的两种类型的Redshift节点,SSD节点(dw2.xl和dw2.8xl)和磁性节点(dx1.xl和dw1.8xl)。SSD的摄入速度也更快。由于您正在寻找非常新鲜的数据,您可能更喜欢使用SSD数据,这通常是较低的成本低于500 of的压缩数据。如果您有超过500 or的压缩数据,可以考虑运行两个不同的集群,一个用于SSD上的“热”数据和上个星期或一个月的数据,另一个用于磁盘上的“冷”数据和所有历史数据。
最后,您实际上不需要将数据上传到S3,这是您摄入时间的主要部分。您可以使用SSH copy选项直接从服务器复制数据。请参阅有关它的更多信息:http://docs.aws.amazon.com/redshift/latest/dg/loading-data-from-remote-hosts.html
如果您能够将Redis队列拆分到多个服务器,或者至少可以将多个具有不同日志文件的队列拆分,那么您可能可以获得非常好的每秒摄入速度记录。
另一种模式,您可能想要考虑,以允许近实时分析是使用亚马逊Kinesis,流媒体服务。它允许以秒的延迟对数据进行分析,同时准备以更优化的方式将数据复制到Redshift中。
发布于 2014-08-23 05:05:39
在较大的数据负载情况下,S3副本的工作速度更快。当你说成千上万的记录需要加载到红移,那么s3上传+拷贝将比插入查询工作得更快。
S3复制在并行模式下工作。
当您创建表并执行插入时,批处理大小将受到限制。单个SQL的最大大小为16 MB。因此,您需要注意SQL批处理的大小(取决于每个插入查询的大小)。
S3副本自动为您的表应用编码(压缩)。当您创建表并使用copy进行示例加载时,您可以看到自动应用压缩。
但是,如果您使用insert命令开始,您将注意到没有压缩应用,这将导致更多的空间表在红移和缓慢的查询进程的定时在某些情况下。
如果您希望使用insert命令,那么用每个列创建表已经应用了编码,以节省空间和加快响应时间。
发布于 2014-11-13 05:24:32
在执行批量上传到Redshift时,实现微批可能是值得的。这篇文章可能值得一读,因为它还包含了为了更好地执行副本逗号而需要遵循的其他技术。
http://blogs.aws.amazon.com/bigdata/post/Tx2ANLN1PGELDJU/Best-Practices-for-Micro-Batch-Loading-on-Amazon-Redshift
https://stackoverflow.com/questions/25454477
复制相似问题