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

Posted

技术标签:

【中文标题】针对大量小文件优化 S3 下载【英文标题】:Optimize S3 download for large number of tiny files 【发布时间】:2018-04-18 14:59:53 【问题描述】:

我目前使用 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】:

处理大量数据始终需要针对底层系统构建存储架构。

如果您需要高吞吐量,则需要对 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

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

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

【讨论】:

我的文件确实附有哈希前缀。我正在寻找能够帮助我实现接近每秒 300 个请求的解决方案(当前的 TransferManager 每秒给我大约 33 个文件)。由于我的工作量,CloudFront 也不适合我。 更新了答案 感谢您指出 Lambda 限制。我知道临时存储,并且我正在尝试处理完全在这些限制范围内的文件(10,000 个大小为 ~20KB 的文件,每个 ~=200MB 这在 Lambda 存储中无法处理。您需要使用外部存储来实现可扩展性。

以上是关于针对大量小文件优化 S3 下载的主要内容,如果未能解决你的问题,请参考以下文章

为生产优化 js - 大量小或一个大的 js 文件

将 S3 上的数百万个小文件存档到 S3 Glacier Deep Archive

在s3中使用pyspark合并多个小json文件[重复]

Hive优化之小文件问题及其解决方案

Hadoop优化配置

iOS Swift 在后台下载大量小文件