我在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

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

有聪明的方法可以做到这一点吗?

同样,如果这是s3中查询数据的可怕文件结构,我将非常感谢您提供有关如何更好地进行设置的建议。

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

作为一个额外的好处,我也想将结果作为一个csv行绑定(bind)在一起。

可以使用此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。

最佳答案

由于您没有回答我的问题,也没有指出要使用的操作系统,因此很难提出任何具体建议,因此我将简要建议您使用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的作者)在SO上,所以我们在一起很好。

关于r - 如何同时从S3下载多个对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30108117/

10-11 04:21
查看更多