如何同时从S3下载多个对象?

时间:2015-05-07 17:38:49

标签: r amazon-web-services amazon-ec2 amazon-s3 aws-cli

我在s3中有很多(数百万)个小日志文件,其名称(日期/时间)有助于定义它,即servername-yyyy-mm-dd-HH-MM。 e.g。

s3://my_bucket/uk4039-2015-05-07-18-15.csv
s3://my_bucket/uk4039-2015-05-07-18-16.csv
s3://my_bucket/uk4039-2015-05-07-18-17.csv
s3://my_bucket/uk4039-2015-05-07-18-18.csv
...
s3://my_bucket/uk4339-2015-05-07-19-23.csv
s3://my_bucket/uk4339-2015-05-07-19-24.csv
...
etc

从EC2开始,使用AWS CLI,我想同时下载2015年所有分钟等于16的文件,仅限所有服务器uk4339和uk4338

有一种聪明的方法吗?

此外,如果这是s3中查询数据的可怕文件结构,我将非常感谢有关如何更好地设置它的任何建议。

我可以将相关的aws s3 cp ...命令放入shell / bash脚本的循环中,以便顺序下载相关文件,但是,想知道是否有更高效的内容。

作为一个额外的奖励,我想将结果排在一起作为一个csv。

可以使用此R代码行在R中生成模拟csv文件的快速示例

R> write.csv(data.frame(cbind(a1=rnorm(100),b1=rnorm(100),c1=rnorm(100))),file='uk4339-2015-05-07-19-24.csv',row.names=FALSE)

创建的csv是uk4339-2015-05-07-19-24.csv。仅供参考,我将在最后将合并后的数据导入R.

1 个答案:

答案 0 :(得分:4)

由于您没有回答我的问题,也没有说明您使用的操作系统,因此提出任何具体建议有点困难,因此我将简要建议您使用GNU Parallel来并行化您的S3获取请求以绕过等待时间。

假设您以某种方式生成所需的所有S3文件的列表,并将结果列表放在名为GrabMe.txt的文件中,如下所示

s3://my_bucket/uk4039-2015-05-07-18-15.csv
s3://my_bucket/uk4039-2015-05-07-18-16.csv
s3://my_bucket/uk4039-2015-05-07-18-17.csv
s3://my_bucket/uk4039-2015-05-07-18-18.csv

然后你可以并行获得它们,一次说32个,就像这样:

parallel -j 32 echo aws s3 cp {} . < GrabMe.txt

或者如果您更喜欢从左到右阅读

cat GrabMe.txt | parallel -j 32 echo aws s3 cp {} . 

显然,您可以将并行请求的数量从32更改为任何其他数字。目前,它只是echo它将运行的命令,但是当您看到它是如何工作时,您可以删除单词echo

有一个很好的教程here,而Ole Tange(GNU Parallel的作者)也是如此,所以我们的团队很好。