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

Posted

技术标签:

【中文标题】将 S3 上的数百万个小文件存档到 S3 Glacier Deep Archive【英文标题】:Archiving millions of small files on S3 to S3 Glacier Deep Archive 【发布时间】:2021-08-03 12:44:57 【问题描述】:

我在 S3 (4TB) 上有大约 80,000,000 个 50KB 文件,我想将它们传输到 Glacier DA。 我开始意识到将大量小文件传输到 Glacier 的成本效率低下。

假设我不介意将我的文件归档到单个(或多个)tar/zip 中 - 将这些文件转换到 Glacier DA 的最佳做法是什么?

需要注意的是,我只有在 S3 上拥有这些文件,而不是在任何本地机器上。

【问题讨论】:

【参考方案1】:

最有效的方法是:

在与存储桶相同的区域中启动 Amazon EC2 实例。选择具有高带宽网络的实例类型(例如 t3 系列)。以现货定价启动它,因为您可以承受它被停止的小机会。分配大量 EBS 磁盘空间。 (或者,您可以选择存储优化实例,因为磁盘空间是免费的,但实例更昂贵。您的选择!) 通过指定要复制的路径(子目录),使用AWS Command-Line Interface (CLI)将文件子集下载到实例。不要一次尝试全部完成! 在 EC2 实例上压缩/压缩文件 使用--storage-class DEEP_ARCHIVE上传压缩文件到 S3 检查一切是否正常,然后重复另一个子集!

上述费用很少,因为您可以在不再需要 EC2 时终止它,并且 EBS 仅在卷存在时才收费。

如果列出文件子集的时间过长,您可以考虑使用Amazon S3 Inventory,它可以提供列出所有对象的每日或每周 CSV 文件。然后,您可以使用此列表专门复制文件,或确定要复制的路径/子目录。

作为一个额外的建议...如果您的系统继续收集甚至更多个文件,您可能会考虑以不同的方式收集数据(例如流式传输到 Kinesis Firehose 以一起批处理数据),或者定期组合数据,而不是让它再次爬到这么多文件。如果可能的话,更少、更大的文件更容易在进程中使用。

【讨论】:

以上是关于将 S3 上的数百万个小文件存档到 S3 Glacier Deep Archive的主要内容,如果未能解决你的问题,请参考以下文章

在 S3 上更新数百万图像标题的最快方法

S3将对象标记为批量,但不覆盖

火花中止火花作业中打开的文件太多

高效地将数百万个 JSON 文件附加到单个文件中

将数百万个文件从根 AZStorageBlob 复制到子文件夹

我可以在交付到 S3 之前在 Kinesis Firehose 中自定义分区吗?