优化大量小文件的S3下载

4

我目前在Lambda函数中使用TransferManager下载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());

下载 10,000 个 大小约为 20KB 的文件,大约需要 300 秒,传输速率大约为 666 KBps

增加线程池大小似乎完全不影响传输速率。

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

如何优化S3下载?

1个回答

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/

希望能够帮到您。
编辑1:
我看到您正在尝试将文件下载到临时存储中,您需要注意存储限制。这些不适用于大量处理。

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


我的文件都有一个哈希前缀附加。我正在寻找解决方案,以帮助我实现每秒接近300个请求的解决方案(当前的TransferManager每秒给我大约33个文件)。由于我的工作量,CloudFront对我也不起作用。 - John Bupit
更新了答案。 - Kannaiyan
感谢指出Lambda的限制。我知道临时存储,并且我正在处理文件,这些文件远远在这些限制之内(每个大小约为20KB的10,000个文件≈200MB <512MB)。我也知道文件描述符限制为1024-您是否建议这是我特定情况下下载速度的瓶颈? - John Bupit
Lambda 存储无法处理这么多数据。为了实现可扩展性,您需要使用外部存储。 - Kannaiyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接