2015-09-01 62 views
0

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

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

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

回答

5

Amazon Redshift并行加载Amazon S3的数据,利用所有节点。从您的测试结果看来,运行多个COPY命令不会提高性能,因为所有节点都已经参与了复制过程。

对于每个表,总是在单个COPY命令中加载尽可能多的文件,而不是稍后追加。如果您要加载多个表,最好按顺序进行(但您的测试可能会发现可以并行加载多个较小的表)。

一些参考:

+0

也尽量保持文件的尺寸尽量均匀,如果文件很小(KB范围)不要费心去压缩它们。 – Guy

相关问题