xargs 与 aws cli(亚马逊 s3 副本)

xargs 与 aws cli(亚马逊 s3 副本)

我正在尝试加快在我的帐户中的 2 个 S3 存储桶之间复制数百个文件的过程。

Bucket1
dt=2017-01-01/ 
   file1, file2, file3 ... file100
..
..
dt=2017-01-31/

每个文件约为 300-400 MB,在某些情况下甚至为 1 GB。

现在,我需要将它们复制到第二个存储桶,即具有相同结构的存储桶 2。

我尝试使用 aws cli 命令,但这非常慢 - aws s3 cp s3://Bucket1/ s3://Bucket2/ --recursive

接下来,我尝试使用带有 & - 的脚本启动并行进程

while read line
do
aws s3 cp s3://Bucket1/${line} s3://Bucket2/${line} --recursive &
done < date-list

Contents of date-list
dt=2017-01-01/
dt=2017-01-02/
..
..

即使这也不是太大的改进,而且我没有看到所有文件夹都被复制。 2017年1月5日之后,它就停止了。想知道为什么。

在寻找可能的解决方案时,我发现了 AWS 的这个博客,他们似乎正在使用 xargshttps://aws.amazon.com/blogs/apn/getting-the-most-out-of-the-amazon-s3-cli/

所以我修改了脚本以使用 xargs 代替 -

while read line
do
echo ${line} | xargs -n1 -P100 -I {} aws s3 cp s3://Bucket1/{} s3://Bucket2/{} --recursive
done < date-list

有没有办法可以触发特定月份所有日期的并行副本?然后,也许晚些时候,一整年。现在,它正在逐日复制,考虑到需要复制全年+的数据,它仍然很慢。

非常感谢任何指点。

答案1

根据 Amazon 的说法,通过 AWS CLI 进行并行调用,您的方向是正确的。 亚马逊绝对推荐它作为一种性能优化技术。

您是否尝试过设置最大并发请求数在你的配置中或者当你调用脚本时?

这是我的一个班轮:

$ seq 0 93 | xargs -I {} date -d "2017-01-01 {} days" +%Y-%m-%d | xargs -I {} -P31 aws s3 cp s3://source_bucket/dt={}/ s3://dest_bucket/dt={}/ --recursive --no-progress

您可以使用命令设置总天数seq(约 3 个月为 93 天),并使用标志设置并行调用的数量(每月约 30 天)-P

我使用该--no-progress选项而不是该--quiet选项,因为我可以将命令的输出通过管道传输到成功传输的日志文件中。

相关内容