通过S3 COPY将数据加载到Redshift中,多线程

时间:2015-09-01 17:32:59

标签: java multithreading amazon-s3 amazon-redshift

我正在使用Redshift进行一些POC工作,使用来自Java程序的copy命令通过S3 json文件加载数据。这个POC正在测试我们为Redshift播种而不是日常使用的初始数据迁移。我的数据被拆分为S3中的大约7500个子文件夹,我希望能够并行插入子文件夹。每个子文件夹包含大约250个json文件,每个文件大约插入3000行。

我的类的单线程版本在大约20秒内从我的一个s3子文件夹加载文件(通过复制命令)。但是,当我引入第二个线程(每个线程从BoneCP连接池获得一个redshift数据库连接)时,每个复制命令(第一个除外)大约需要40秒。当我在Redshift中运行查询以显示所有正在运行的查询时,Redshift表示它正在同时运行两个查询(如预期的那样)。但是,就好像第二个查询真的在等待第一个查询开始工作之前完成。我预计每个复制命令仍然只需要20秒。 Redshift控制台显示我只能运行单线程或双线程的高达60%的CPU使用率。

这可能是因为我的Redshift群集中只有1个节点吗?或者Redshift无法打开到S3的多个连接来获取数据?我很感激有关如何通过运行多线程复制命令来获得性能提升的任何提示。

1 个答案:

答案 0 :(得分:6)

Amazon Redshift loads data from Amazon S3 in parallel, utilising all nodes. From your test results, it would appear that running multiple COPY commands does not improve performance, since all nodes are already involved in the copy process.

For each table, always load as many files as possible in a single COPY command, rather than appending later. If you are loading multiple tables, it is likely best to do them sequentially (but your testing might find that loading multiple smaller tables can be done in parallel).

Some references: