【发布时间】:2014-10-16 17:57:21
【问题描述】:
我有一个用于某些分析应用程序的 redshift 集群。我有想要添加到clicks 表的传入数据。假设我每秒要存储约 10 次新的“点击”。如果可能的话,我希望我的数据尽快在 redshift 中可用。
据我了解,由于是列式存储,插入性能不好,所以必须分批插入。我的工作流程是将点击存储在 redis 中,每分钟,我将大约 600 次点击从 redis 插入到 redshift。
我有两种方法可以在 redshift 中插入一批点击:
-
Multi-row insert strategy:我使用常规的insert查询来插入多行。 Multi-row insert documentation here -
S3 Copy strategy:我将 s3 中的行复制为clicks_1408736038.csv。然后我运行COPY将其加载到clicks表中。 COPY documentation here
我已经做了一些测试(这是在一个已经有 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 时间。
问题:
每种方法的优缺点是什么?最佳做法是什么?我错过了什么吗?
还有一个问题:是否可以通过清单自动从 s3 中红移到 COPY 数据?我的意思是只要将新的.csv 文件添加到 s3 中就复制数据?文档here 和here。还是我必须自己创建一个后台工作人员来触发 COPY 命令?
我的快速分析:
In the documentation about consistency,没有提到通过多行插入加载数据。看起来首选方式是来自 s3 的 COPYing 具有唯一对象键(s3 上的每个 .csv 都有自己唯一的名称)...
-
S3 Copy strategy:- 优点:看起来像是文档中的良好做法。
- 缺点:更多工作(我必须管理存储桶和清单以及触发
COPY命令的 cron...)
-
Multi-row insert strategy- 优点:工作量少。我可以从我的应用程序代码中调用
insert查询 - 缺点:看起来不像是导入数据的标准方式。我错过了什么吗?
- 优点:工作量少。我可以从我的应用程序代码中调用
【问题讨论】:
-
如何确保没有将同一记录复制到 s3 两次?换句话说,您是否每分钟将整个点击桶上传到 S3?我很好奇你是如何避免重复的
-
@KevinMeredith 我认为首选的方法是使用临时表。 Documentation for creating the staging table, Documentation for upserting
-
注意:AWS 有一项名为 Redshift Spectrum 的服务,可让您直接从 Redshift 查询 s3 数据。请参阅this post 了解更多信息。推荐的格式是将 s3 文件存储为 parquet,但 CSV 也可以。