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

Loading data into Redshift via S3 COPY, multi-threaded

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

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

这会不会是因为我的 Redshift 集群中只有 1 个节点?还是 Redshift 无法打开到 S3 的多个连接来获取数据?对于如何通过 运行ning 多线程复制命令获得一些性能提升的任何提示,我将不胜感激。

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

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

一些参考资料: