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

h.l*_*l.m 5 r amazon-s3 amazon-ec2 amazon-web-services aws-cli

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

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
Run Code Online (Sandbox Code Playgroud)

从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)
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ell 6

由于您没有回答我的问题,也没有说明您使用的是什么操作系统,因此很难提出任何具体建议,因此我将简要建议您使用 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
Run Code Online (Sandbox Code Playgroud)

然后你可以并行获取它们,一次说 32 个,如下所示:

parallel -j 32 echo aws s3 cp {} . < GrabMe.txt
Run Code Online (Sandbox Code Playgroud)

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

cat GrabMe.txt | parallel -j 32 echo aws s3 cp {} . 
Run Code Online (Sandbox Code Playgroud)

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

这是一个很好的教程在这里,和OLE丹(GNU并行的作者)是如此,所以我们是在良好的公司。

  • 猫 GrabMe.txt | 并行-jk 32 'aws s3 cp {} .; grep -v \" {}' &gt; big.csv (2认同)