Amazon s3 Amazon红移:大容量插入与从s3复制

Amazon s3 Amazon红移:大容量插入与从s3复制,amazon-s3,amazon-redshift,Amazon S3,Amazon Redshift,我有一个红移集群,用于一些分析应用程序。我有要添加到单击表中的传入数据。比如说,我每秒要存储约10次新的“点击”。如果可能的话,我希望我的数据能尽快以红移的形式提供 据我所知,由于柱状存储,insert性能很差,所以必须分批插入。我的工作流程是将点击存储在redis中,每分钟我都会将~600次点击从redis批量插入redshift 我有两种方法可以将一批单击插入红移: 多行插入策略:我使用常规的插入查询来插入多行 S3复制策略:我在单击时复制S3中的行。然后我运行一个COPY,将其加载到单击

我有一个红移集群,用于一些分析应用程序。我有要添加到
单击
表中的传入数据。比如说,我每秒要存储约10次新的“点击”。如果可能的话,我希望我的数据能尽快以红移的形式提供

据我所知,由于柱状存储,insert性能很差,所以必须分批插入。我的工作流程是将点击存储在redis中,每分钟我都会将~600次点击从redis批量插入redshift

我有两种方法可以将一批单击插入红移:

  • 多行插入策略
    :我使用常规的
    插入
    查询来插入多行
  • S3复制策略
    :我在单击
    时复制S3中的行。然后我运行一个
    COPY
    ,将其加载到
    单击的
    表中
    
我做了一些测试(这是在已经有200万行的
点击
表上完成的):

正如您所看到的,就性能而言,首先在s3中复制数据似乎没有任何好处。
上传
+
复制
时间等于
插入
时间

问题:

每种方法的优缺点是什么?最好的做法是什么?我错过什么了吗

附带问题:是否可以通过清单将数据自动从s3红移到
复制
?我的意思是在s3中添加新的
.csv
文件后立即复制数据?博士和。还是我必须自己创建一个后台工作程序来触发复制命令

我的快速分析:

,没有提到通过多行插入加载数据。看起来首选的方法是使用唯一的对象键从s3中复制(s3上的每个
.csv
都有自己的唯一名称)

  • S3复制策略
    • 优点:看起来像是文档中的良好实践
    • 缺点:更多的工作(我必须管理bucket和清单,以及触发
      COPY
      命令的cron…)
  • 多行插入策略
    • 优点:工作量少。我可以从我的应用程序代码调用
      insert
      查询
    • 缺点:看起来不像是导入数据的标准方式。我错过什么了吗

S3拷贝在数据负载较大的情况下工作得更快。当您说需要将成千上万条记录加载到redshift时,s3 upload+copy的工作速度将比insert查询快

S3拷贝以并行模式工作

当您创建表并执行insert时,批次大小是有限制的。单个SQL的最大大小为16 MB。所以您需要注意SQL批处理的大小(取决于每个插入查询的大小)

S3副本会自动为您的表应用编码(压缩)。当您创建表并使用copy加载示例时,您可以看到自动应用了压缩

但若您在开始时使用insert命令,您将注意到并没有应用压缩,这将在红移中为表带来更多空间,并且在某些情况下会减慢查询过程的计时


如果您希望使用insert命令,则create table with PER column已应用编码以节省空间和更快的响应时间。

红移是一种分析数据库,它经过优化以允许您查询数百万和数十亿条记录。它还进行了优化,允许您使用COPY命令将这些记录快速吸收到红移中

COPY命令的设计是将多个文件并行加载到集群的多个节点中。例如,如果您有一个5个小节点(dw2.xl)集群,那么如果您的数据是多个文件(例如20个),那么复制数据的速度可以提高10倍。在文件数量和每个文件中的记录数量之间有一个平衡,因为每个文件都有一些小的开销

这将使您在复制频率(例如每5或15分钟,而不是每30秒)与事件文件的大小和数量之间取得平衡

另一个要考虑的点是2种类型的红移节点,SSD节点(DW2.xL和DW2.8xL)和磁性节点(Dx1.xl和DW1.8xL)。SSD的摄取速度也更快。由于您正在寻找非常新鲜的数据,您可能更喜欢使用SSD数据,对于小于500GB的压缩数据,SSD数据通常成本较低。如果随着时间的推移,你拥有超过500 GB的压缩数据,你可以考虑运行2个不同的集群,一个是SSD上的“热”数据,一个是上个星期或一个月的数据,一个是关于所有历史数据的磁盘上的“冷”数据。p> 最后,您实际上不需要将数据上传到S3,S3是您摄入时间的主要部分。您可以使用SSH copy选项直接从服务器复制数据。请参见此处的更多信息:

如果您能够将Redis队列拆分为多个服务器或至少多个具有不同日志文件的队列,则每秒摄取速度可能会非常好


另一个你想考虑允许近乎实时分析的模式是Amazon CkyScript,即流媒体服务的使用。它允许在几秒钟的延迟内对数据运行分析,同时以更优化的方式准备数据以复制到红移中

在执行到Redshift的批量上传时,实施微批处理可能是值得的。这篇文章可能值得一读,因为它还包含了为提高复制命令的性能而需要遵循的其他技术


我的测试结果有点不同。我正在从OS Windows桌面将CSV文件加载到Redshift

  • 行插入速度最慢
  • 多行插入5倍于fas
                 | 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    |