私のアカウントにある2つのS3バケット間で何百ものファイルをコピーするプロセスをスピードアップしようとしています。
Bucket1
dt=2017-01-01/
file1, file2, file3 ... file100
..
..
dt=2017-01-31/
各ファイルのサイズは約300〜400 MBで、場合によっては1 GBになります。
これで、それを2番目のバケット、つまり同じ構造のバケット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でこのブログを見つけましたが、xargsを使用しているようです。https://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年後になるかもしれません。今は毎日複製されていますが、1年以上のデータを複製する必要があることを考慮すると、まだ遅くなります。
どんなアドバイスも本当にありがとうございます。
答え1
Amazonによると、AWS CLIを介して並列呼び出しを実行すると、正しい方向に向かっています。 Amazon性能最適化技術としてはっきりお勧めします。
最大同時リクエスト数を設定してみましたか?あなたの構成でそれともスクリプトを呼び出すとき?
私のライナーの1つは次のとおりです。
$ 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