在 S3 上压缩文件

Posted

技术标签:

【中文标题】在 S3 上压缩文件【英文标题】:Compress file on S3 【发布时间】:2013-01-07 20:16:45 【问题描述】:

我在 S3 上有一个 17.7GB 的文件。它是作为 Hive 查询的输出生成的,并且没有被压缩。

我知道通过压缩它大约有 2.2GB (gzip)。当传输成为瓶颈(250kB/s)时,如何尽快在本地下载此文件。

我没有找到任何直接的方法来压缩 S3 上的文件,或者在 s3cmd、boto 或相关工具中启用传输压缩。

【问题讨论】:

您是否能够通过重新运行 Hive 查询来重新生成此文件?如果是,我建议为您的 Hive 查询启用输出压缩。 @CharlesMenguy:我实际上是第一次这样做(我想)。然而,语句中有一个order by,这影响了输出。通常我会为每个映射作业获取一个文件,但我从 reduce 中得到一个文件,我认为这是完成排序的地方。 您是如何在查询中启用输出压缩的?我认为您应该能够压缩几乎任何 Hive 查询的输出,无论是否存在 order by。我假设您通过 insert overwrite directory 's3n://...' 写信给 S3,对吧? docs.aws.amazon.com/ElasticMapReduce/latest/DeveloperGuide/… 【参考方案1】:

S3 不支持流压缩,也无法远程压缩上传的文件。

如果这是一次性过程,我建议将其下载到同一区域的 EC2 机器上,在那里压缩,然后上传到您的目的地。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html

如果你更频繁地需要这个

Serving gzipped CSS and javascript from Amazon CloudFront via S3

【讨论】:

这仍然是真的吗? 它仍然是真的,你不能在 s3 上就地修改文件。您可以将压缩文件流式传输到s3并在读取后压缩输出【参考方案2】:

迟到的答案,但我发现这工作得很好。

aws s3 sync s3://your-pics .

for file in "$(find . -name "*.jpg")"; do gzip "$file"; echo "$file";  done

aws s3 sync . s3://your-pics --content-encoding gzip --dryrun

这会将 s3 存储桶中的所有文件下载到机器(或 ec2 实例),压缩图像文件并将它们上传回 s3 存储桶。 在删除dryrun标志之前验证数据。

【讨论】:

抱歉,我不能放弃“查找”用法。而不是 grep 你应该使用:find ./ -name "*.jpg" @tamerlaha 为什么使用 find 而不是 grep? 因为grep 不适合按扩展名搜索文件。 在这种情况下,您实际上不需要使用 find 或 for。您可以只做gzip *.jpggzip -9 *.jpg 以确保最高压缩率。它将 gzip 压缩当前目录中的所有 jpg 文件。【参考方案3】:

现在 Lambda 中有预构建的应用程序,您可以使用它们来压缩 S3 存储桶中的图像和文件。因此,只需创建一个新的 Lambda 函数并选择您选择的预构建应用程序并完成配置。

    第 1 步 - 创建一个新的 Lambda 函数 第 2 步 - 搜索预构建的应用程序 第 3 步 - 选择适合您需要的应​​用程序,并通过提供 S3 存储桶名称来完成配置过程。

【讨论】:

以上是关于在 S3 上压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

在 S3 中使用 lambda 函数解压缩档案真的很慢

将文件上传并压缩到s3

在scala中从S3解压缩文件时出现FileNotFoundException

在 S3 中上传输入流块后无法解压缩 gzip 文件

AWS Lambda (Python) 无法在 S3 中解压缩和存储文件

AWS Spectrum 扫描错误压缩文件意外结束