Xargs

帶有 aws cli 的 xargs(亞馬遜 s3 副本)

  • December 1, 2017

我正在嘗試加快在我的帳戶中的 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-01-05 之後,它有點停止了。想知道為什麼。

在尋找可能的解決方案時,我發現了 AWS 的這個部落格,他們似乎在使用 xargs https://aws.amazon.com/blogs/apn/getting-the-most-out-of-the-amazon-s3-命令行/

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

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

有沒有辦法可以觸發特定月份所有日子的並行副本?然後,也許以後,整年。現在,它每天都在複製,考慮到全年+需要複製的數據,它仍然很慢。

真的很感激任何指示。

根據 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 天)並使用-P標誌設置並行呼叫數(一次約 30 天)。

我使用該--no-progress選項而不是該--quiet選項,因為我可以將命令的輸出通過管道傳輸到成功傳輸的日誌文件。

引用自:https://unix.stackexchange.com/questions/371637