Daha hızlı s3 kova çoğaltma


94

Paketleri kopyalamak için s3cmd'den daha iyi bir komut satırı aracı bulmaya çalışıyorum . s3cmdher dosyayı indirmek ve yüklemek zorunda kalmadan paketleri çoğaltabilir. Normalde s3cmd kullanarak paketleri kopyalamak için çalıştırdığım komut şudur:

s3cmd cp -r --acl-public s3://bucket1 s3://bucket2

Bu işe yarar, ancak her dosyayı API aracılığıyla birer birer kopyaladığından çok yavaştır. Eğer s3cmdparalel modda çalıştırabilir, çok mutlu olurum.

İnsanların daha hızlı olan paketleri çoğaltmak için kullandıkları komut satırı araçları veya kod olarak kullanılabilen başka seçenekler var s3cmdmı?

Düzenleme: Görünüşe göre s3cmd-modifikasyonu tam olarak aradığım şey. Ne yazık ki işe yaramıyor. Başka seçenek var mı?


6
Bu sorunun neden tekrar tekrar kapatıldığından emin değilim, çünkü birçok geliştirici bu soruyla karşılaştı. Her neyse, son derece paralel bir şekilde çözdüm , işte bağlantı: github.com/cobbzilla/s3s3mirror teşekkürler! - Jonathan.
cobbzilla

Yanıtlar:


167

AWS CLI işi mükemmel bir şekilde yapıyor gibi görünüyor ve resmi olarak desteklenen bir araç olma avantajına sahip.

aws s3 sync s3://mybucket s3://backup-mybucket

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

Varsayılan olarak eşzamanlı transferleri destekler. Bkz. Http://docs.aws.amazon.com/cli/latest/topic/s3-config.html#max-concurrent-requests

Çok sayıda küçük dosyayı hızlı bir şekilde aktarmak için, komut dosyasını bir EC2 bulut sunucusundan çalıştırın ve gecikmeyi max_concurrent_requestsazaltın ve gecikmenin etkisini azaltmak için artırın . Örneğin:

aws configure set default.s3.max_concurrent_requests 200

5
Dosyanın değiştirilme zamanı, boyutu vb. Temelinde eşzamanlı olmayan senkronizasyonu destekler. Denediğimde çok hızlıydı. Nesnelerin yerel makineye indirilmeden doğrudan S3'e kopyalandığına inanıyorum. Varsayılan olarak paralel çalışmaz, ancak aynı anda ayrı alt klasörlerde çalışan birden fazla senkronizasyon komutunuz olabileceğinden eminim. Yeterince hızlıdır ki muhtemelen zaten paralel olarak çalışmasına ihtiyacınız olmayacak. Birkaç dakika içinde 100GB veriyi kopyaladım.
python1981

11
Dosya sayısı yüksekse cehennem kadar yavaş.
Phương Nguyenễn

14
Çok sayıda küçük dosya aktarılırken gecikme anahtar kısıtlama haline gelir, bu nedenle bu komutu bir EC2 bulut sunucusundan çalıştırmak çok önemlidir.
python1981

1
Bir liman işçisi oluşturmak için bu kullanılır ve oldukça iyi çalışıyor github.com/sunshineo/s3-bucket-copier
Gordon Sun

3
Şimdi eşzamanlı senkronizasyonu destekliyor :-) docs.aws.amazon.com/cli/latest/topic/…
python1981

71

AWS konsolunu kullanmaktan çekinmiyorsanız şunları yapabilirsiniz:

  1. İlk paketteki tüm dosyaları / klasörleri seçin
  2. İşlemler> Kopyala'yı tıklayın
  3. Yeni bir paket oluşturun ve seçin
  4. Eylemler> Yapıştır'ı tıklayın

Hala oldukça yavaş, ancak onu rahat bırakabilir ve işini yapmasına izin verebilirsiniz.


Bu, hedefe kopyalarken kaynak paketin içeriğini makineme mi kopyalıyor? Çok fazla ağ etkinliği var ve tarayıcı denetçisi son derece yavaş, bu yüzden analiz etmesi zor. Makinemde 600K / s çıktı. Bu, amazon ağı içinde transferi başlatmak için çok daha hızlı olacaktır ... Onun yerine orada deneyeceğim.
Brad Goss

9
Bugün bu yöntemi kullandım. Dosyaları yerel makinenize indirmez - doğrudan bir kopya yapar ve çok, çok daha hızlıdır.
Greg Benedict

7
Yine de dosya listesini getirir. Liste çok uzunsa (benim durumumda düzine binlerce dosya) o zaman çok yavaş. Ve zaman aşımı /
takılma

14
Maalesef bu süreç tarayıcıya bağlı. :( Kimden Dokümanlardan : "Kopyalama işlemini başlattıktan sonra, kopyalama devam ederken tarayıcıyı açık tutmalısınız."
David Lemayian

5
Bunu içinde 8 milyon dosya olan bir kova üzerinde yapmaya çalışıyorum. Tüm onay kutularını
Chris Harrison

28

AWS web konsolu olan s3cmdve AWS CLI'yi kullanarak iki paket klonlamayı denedim . Bu yöntemler çoğu zaman işe yarasa da ağrılı bir şekilde yavaştır.

Sonra buldum s3s3mirror: iki S3 kovasını senkronize etmek için özel bir araç. Çok iş parçacıklı ve denediğim diğer yaklaşımlardan çok daha hızlı. Giga baytlık veriyi bir AWS bölgesinden diğerine hızla taşıdım.

Şuradan kontrol edin: https://github.com/cobbzilla/s3s3mirror veya bir Docker kabı indirmek https://registry.hub.docker.com/u/pmoust/s3s3mirror/


1
Aktaracak çok sayıda dosyanız varsa, bu iş için açık ara en iyi araçtır. Yazık ki cevap listesinin çok altında ...
John Chrysostom

Bazı kişilere not: Derlemek için Java 6/7 gerekir.
Brian

1
Bunu bir EC2 bulut sunucusundan kullanıyorum ve inanılmaz derecede hızlı çalışıyor! <source-bucket> ve <destination-bucket> öğelerini gerçek paket adıyla değiştirmek zorunda kaldım (uç nokta veya AWS CLI'deki gibi bir şey değil).
ironmouse

1
Çok sayıda dosya için diğerlerine göre şiddetle tavsiye edilen harika bir araç. Kopya iş parçacığı sayısının kontrolü mükemmeldir.
Shaunak

İşi yapmak için üçüncü taraf uygulamaları değil, aws-cli kullanmanın daha güvenli olduğunu düşünmüyor musunuz? Sonuçta, bu araçları kullanmak için kimlik bilgileri veya erişim anahtarları sağlamamız gerekiyor.
Keet Sugathadasa

11

Anlık çözüm için paketler aws cliarasında senkronizasyon yapmak için kullanın :

aws s3 synchız şunlara bağlıdır:
- S3 uç noktasına API çağrısı için gecikme
- eşzamanlı olarak yapılan API çağrılarının miktarı

Senkronizasyon hızını artırmak için:
- aws s3 syncbir AWS bulut sunucusundan çalıştırın (FreeBSD'de c3.large TAMAM ;-))
- ~ / .aws / config'i şu şekilde güncelleyin:
- max_concurrent_requests = 128
-max_queue_size = 8096

aşağıdaki yapılandırma ve örnek türü ile grubu (309GB, 72K dosyalar, us-east-1) 474 saniye içinde senkronize edebildim.

Daha genel bir çözüm için AWS DataPipeLine veya S3 bölgeler arası çoğaltmayı göz önünde bulundurun.


S3 cp kullanırsam aynı performansı bekleyebileceğimi biliyor musunuz? Senkronizasyonu kullandığınızda 309 GB'ın tamamını aktardığından emin misiniz? senkronizasyon yalnızca aynı olmayan veya diğer pakette bulunan dosyaları senkronize eder.
soğuk

Ayrıca, 1k veya daha az dosyamın olduğu, ancak boyutlarının daha büyük olduğu (10 gb) bir kullanım durumu için bu konudaki düşünceleriniz nelerdir? Sizinkine benzer bir performans göreceğimi düşünüyor musunuz?
soğuk

@frosty, benim durumumda hedef kova boştu. awsclibelge başına - aws syncyalnızca yeni ve güncellenmiş dosyaları kopyalayın. muhtemelen yüksek performans beklemelisiniz aws cp(kopyalama dahili olarak yapılır, istemciniz sadece bir API çağrısı yayınlar). performans şu faktörlere bağlıdır: 1. src ve dst bölgeleri arasındaki gecikme (ör. us-east-X'den us-west-X'e) 2. istemciniz ile AWS API uç noktası arasındaki gecikme (bir API çağrısı ne kadar hızlı yapabilirsiniz) 3. eşzamanlı istek miktarı (müşterinizin saniyede kaç istek gönderebileceği). Benim durumumda 309G aynı bölgedeki kovalar arasında kopyalandı (us-east-1)
Tom Lime


2

Başka bir S3 komut satırı aracı bilmiyorum, ancak burada hiçbir şey çıkmazsa, en kolayı kendinizinkini yazmak olabilir.

Tercih ettiğiniz Amazon SDK / Toolkit'i seçin. Ardından, kaynak paket içeriğini listelemeniz / almanız ve her bir dosyayı kopyalamanız gerekir (tabii ki paralel olarak)

S3cmd-modifikasyonu için kaynağa baktığımda (ve python hakkında hiçbir şey bilmediğimi kabul ediyorum), paketten pakete kodu paralelleştirmemiş gibi görünüyorlar, ancak belki de standart karşıya yükleme / indirme paralel kodunu başlangıç ​​noktası olarak kullanabilirsiniz. Bunu yap.


Evet. Bu fikirle oynuyordum ve olay makinesiyle ya da JRuby ile işlenmiş şekilde yakutla yazıyorum. Ancak, s3cmd zaten oldukça tamamlandı ve bunu kullanmayı tercih ederim. S3cmd'nin geliştiricisiyle konuşuyordum ve boru hattında muhtemelen performans sorunlarını ele alacak birkaç çözümü var.
Sean McCleary

1

basit bir aws s3 cp s3://[original-bucket] s3://[backup-bucket] --recursiveişe yarıyor (aws cli kurulumunuz olduğunu varsayarak)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.