我最近开始使用S3,并且遇到了将大文件(10 gb + - )上传和压缩到s3的需求。 我正在使用的当前实现是创建一个临时压缩文件localy,然后将其上传到s3,最后删除临时文件。问题是,对于一个10 GB的文件,我有几乎20 gb localy存储,直到上传完成。我需要一种方法将文件传输到s3,然后在那里压缩它。 这种方法可行吗?如果是的话,我应该如何解决它?如果没有,有什么办法可以最大限度地减少所需的当地空间吗? 我看到有人认为文件可以上传到S3,下载到同一区域的EC2,在那里压缩然后上传回S3,同时删除S3上的第一个副本。这可能会有效,但在我看来,上传一个文件的2次上传在成本上并不是一个优势。
我尝试上传压缩流但没有成功,但我刚刚发现s3不支持压缩流,现在我对如何继续进行无能为力。
我在.NET上使用gzip库
答案 0 :(得分:9)
在linux shell中,通过aws-cli,在你提出问题后大约3个月就添加了这个: - )
Added the ability to stream data using cp
因此,我认为最好的办法是将gzip的输出传输到aws cli:
从stdin上传:
gzip -c big_file | aws s3 cp - s3://bucket/folder/big_file.gz
下载到stdout:
aws s3 cp s3://bucket/folder/big_file.gz - | gunzip -c ...
答案 1 :(得分:5)
如果空间在您最初文件所在的位置处于溢价状态,则将文件上载到S3,然后在与S3相同的区域中的EC2实例上下载,压缩和重新上载文件到S3存储桶实际上是一个非常明智的(如果看似反直觉的)建议,原因很简单:
AWS does not charge you for bandwidth介于同一区域内的EC2和S3之间。
这是spot instance的理想工作......也是SQS告诉现场机器需要做什么的一个很好的用例。
另一方面...... 如果您不首先压缩该文件,则会花费更多本地带宽上传该文件。
如果您是程序员,您应该能够创建一个类似于我编写的实用程序供内部使用(这不是插件;它目前不可用于发布)压缩(通过外部工具)并即时将文件上传到S3。
它的工作原理类似于伪代码示例命令行:
cat input_file | gzip -9c | stream-to-s3 --bucket 'the-bucket' --key 'the/path'
这是一个简化的用法示例,用于说明概念。当然,我的“stream-to-s3”实用程序接受了许多其他参数,包括x-amz-meta元数据,aws访问密钥和秘密,但你也许会得到这个想法。
gzip,pigz,bzip2,pbzip2,xz和pixz等常用压缩工具都可以从STDIN
读取源文件,并将压缩数据写入STDOUT
,而无需编写压缩版本的文件到磁盘。
我使用的实用程序通过管道从STDIN
读取文件数据,并使用S3 Multipart Upload(即使是技术上不需要它的小文件,因为S3 Multipart上传聪明地不要求您事先知道文件的大小),它只是一直向S3发送数据,直到它的输入流达到EOF
。然后它完成分段上传并确保一切都成功。
我使用此实用程序通过压缩来构建和上载整个tarball,而不会触及单个磁盘空间块。同样,编写并不是特别困难,而且可以用多种语言完成。我甚至没有使用任何S3 SDK,我使用标准HTTP用户代理和S3 API文档从头开始自己编写。
答案 2 :(得分:1)
我需要一种方法将文件传输到s3,然后在那里压缩它。这种方法可行吗?
这种方法不可行/不可选。压缩需要大量的CPU资源,而Amazon S3则负责存储数据,而不是对文件执行繁重的处理。
使用S3,您还可以为上传的内容支付带宽,因此您需要浪费资金发送更多数据。
我见过有人认为文件可以上传到S3,下载到同一地区的EC2,然后在那里压缩 在S3上删除第一个副本时上传回S3。
您可以做的是直接上传到EC2,在那里压缩,然后从那里上传到S3。但现在您已将20GB问题从本地计算机移至EC2实例。
最好的方法是继续使用当前的本地压缩方法然后上传。
答案 3 :(得分:0)
如果您使用的是.NET,则可以执行char流,但仍需要一些大于20 GB的本地存储。
另外,作为坏消息的承载者来自亚马逊的S3只是存储。您可能需要启动另一个服务(aws),而不是运行可以压缩存储的程序。因此,您的应用使用S3存储上传和压缩。
如果您的项目较小,您可能需要考虑IaaS提供商而不是PaaS。这样,存储和应用程序可以位于同一组服务器上。
答案 4 :(得分:0)
上传吞吐量的一个非常重要的S3功能是并行上传。有几种工具可以做到这一点,例如aws cli,s3cmd或crossftp。从.NET API,使用TransferUtility
类
如果您确实需要压缩,请查看S3DistCP,这是一种可以使用多台并行机器进行传输并即时压缩的工具。