针对大量小文件优化S3下载

时间:2018-04-18 14:59:53

标签: java amazon-web-services amazon-s3 io

我目前使用TransferManager从Lambda函数下载S3存储桶中的所有文件。

// Initialize
TransferManagerBuilder txBuilder = TransferManagerBuilder.standard();
// txBuilder.setExecutorFactory(() -> Executors.newFixedThreadPool(50));
TransferManager tx = txBuilder.build();
final Path tmpDir = Files.createTempDirectory("/tmp/s3_download/");

// Download
MultipleFileDownload download = tx.downloadDirectory(bucketName,
                                                     bucketKey,
                                                     new File(tmpDir.toUri()));
download.waitForCompletion();

return Files.list(tmpDir.resolve(bucketKey)).collect(Collectors.toList());

似乎需要花费300 seconds下载10,000 files(大小为~20KB each),我的转移率约为666 KBps。 增加线程池大小似乎根本不会影响传输速率。

S3端点和lambda函数位于同一AWS区域,并位于同一AWS账户中。

如何优化S3下载?

1 个答案:

答案 0 :(得分:1)

处理大量数据总是需要根据底层系统构建存储。

如果您需要高吞吐量,则需要对s3键进行分区,以便它可以容纳大量请求。分布式计算具有自身的高性能服务需求,这就是这样的需求。

请求率注意事项:

https://docs.aws.amazon.com/AmazonS3/latest/dev/request-rate-perf-considerations.html

转移加速:

https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

如何提高吞吐量:

https://aws.amazon.com/premiumsupport/knowledge-center/s3-bucket-performance-improve/

希望它有所帮助。

<强> EDIT1

我发现您正在尝试将文件下载到Ephemeral存储,您需要了解存储限制。这些不适用于批量处理。

https://docs.aws.amazon.com/lambda/latest/dg/limits.html