在 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 *.jpg
或gzip -9 *.jpg
以确保最高压缩率。它将 gzip 压缩当前目录中的所有 jpg 文件。【参考方案3】:
现在 Lambda 中有预构建的应用程序,您可以使用它们来压缩 S3 存储桶中的图像和文件。因此,只需创建一个新的 Lambda 函数并选择您选择的预构建应用程序并完成配置。
-
第 1 步 - 创建一个新的 Lambda 函数
第 2 步 - 搜索预构建的应用程序
第 3 步 - 选择适合您需要的应用程序,并通过提供 S3 存储桶名称来完成配置过程。
【讨论】:
以上是关于在 S3 上压缩文件的主要内容,如果未能解决你的问题,请参考以下文章
在scala中从S3解压缩文件时出现FileNotFoundException