Dosyaları minimum maliyetle iki S3 kovası arasında nasıl taşırım?


44

Bir Amazon S3 kovasında milyonlarca dosyam var ve bu dosyaları asgari maliyetle veya mümkün olduğunda ücretsiz olarak diğer kovalara ve klasörlere taşımak istiyorum. Bütün kovalar aynı bölgededir.

Nasıl yapabilirim?

Yanıtlar:


53

Milyonlarca büyük bir sayı - daha sonra geri döneceğim.

Yaklaşımınızdan bağımsız olarak, temel mekanizmanın doğrudan bir kovadan diğerine kopyalanması gerekir - bu şekilde (kovalarınız aynı bölgede olduğu için) bant genişliği için herhangi bir ücret ödemezsiniz. Diğer herhangi bir yaklaşım sadece verimsizdir (örneğin, dosyaların indirilmesi ve yeniden yüklenmesi).

Kovalar arasında kopyalama, 'PUT kopyası' kullanılarak gerçekleştirilir - bu, 'x-amz-kopya kaynağı kaynak' başlığını içeren bir PUT isteğidir - bunun bir COPY isteği olarak sınıflandırıldığına inanıyorum. Bu dosyayı ve varsayılan olarak ilişkili meta verileri kopyalar. ACL'yi aynı anda ayarlamak istiyorsanız doğru değere sahip bir 'x-amz-acl' eklemelisiniz (aksi takdirde varsayılan olarak özel olur). COPY talepleriniz için tahsil edilecektir (0.01 $ / 1.000 istek). Gereksiz dosyaları kopyalandıktan sonra silebilirsiniz (SİLME istekleri tahsil edilmez). (Açıkça bilmediğim bir nokta, bir COPY isteğinin ayrıca bir GET isteğinin ücretini de getirip getirmediğidir, çünkü nesne önce kaynak kovadan alınmalıdır - eğer öyleyse, ek ücret 0.01 / 10.000 ABD Doları olacaktır. istekleri).

Yukarıdaki masraflar görünüşte kaçınılmaz görünüyor - bir milyon nesneye yaklaşık 10 dolar (veya 11 dolar) bakıyorsunuz. Sonunda gerçekten hedef kovandaki dosyaları oluşturmanız gerektiğinden, diğer yaklaşımlar (örneğin, tar-gzipping, Amazon Alma / Verme, vb.) Bu maliyeti aşmaz. Hiçbiri, aktarılacak birkaç milyondan fazla nesneniz varsa, Amazon'la iletişim kurarken buna değebilir.

Yukarıdakiler göz önüne alındığında (kaçınılmaz fiyat), dikkat edilmesi gereken bir sonraki şey 'milyonlarca dosya' kopyalanırken büyük bir etken olacak zamandır. Kovalar arasında doğrudan kopya yapabilen tüm aletler aynı yüke tabidir. Ne yazık ki, dosya başına bir istek (kopyalamak), silmek için bir istek ve ACL verilerini okumak için bir istek (dosyalarınız farklı ACL'lere sahipse) gerekir. En iyi hız, en paralel işlemleri yürütebilecek olandan gelir.

Oldukça uygun olabilecek bazı komut satırı yaklaşımları var:

  • s3cmd modifikasyonu (bu özel çekme isteği), paralel cp ve mv komutlarını içerir ve sizin için iyi bir seçenek olmalıdır.
  • AWS konsolu kopyayı doğrudan yapabilir - Ne kadar paralel olduğu konusunda konuşamam.
  • Tim Kay'ın aws betiği kopyayı yapabilir - ancak paralel değil - istediğiniz tam kopyayı çalıştırmak için betiğe ihtiyacınız olacak (muhtemelen bu durumda en iyi seçenek değil - bununla birlikte harika bir komut dosyası).
  • CloudBerry S3 Explorer , Bucket Explorer ve CloudBuddy bu görevi yerine getirebilmelidir, ancak her birinin verimliliğinin nasıl arttığını bilmiyorum. Bunların çoğunun çok parçacıklı özelliklerinin yazılımın satın alınmasını gerektirdiğine inanıyorum.
  • Kullanılabilir SDK'lardan birini kullanarak kendi komut dosyasını yazınız.

S3fs işe yarayabilecek bazı olasılığı vardır - Farklı kovalar arasındaki kopyalarını DESTEKLEMEZ ama - oldukça paraleldir, aynı kova arasındaki destek kopyalarını yapar belki farklı kovalar arasındaki hareketini desteklemek.

S3cmd-modifikasyon ile başlar ve daha iyi bir çözüm için herhangi bir başarınız olup olmadığını görürsünüz ya da Amazon'la temasa geçiyorum.


Bucket Explorer benim için iyi çalışıyor gibi görünüyor (şu anda iki kova arasında dosya taşıma)
Noodles

3
Nerede mu aws s3 sync s3://source s3://destinationsığacak?
Olivier Lalonde

7

Eski konu, ancak bu aynı senaryoyu araştıran herkes içindir. 20.000'in üzerinde nesne için beni aldı. AWS Linux / Centos'ta çalışan nesnelerin çoğu, bazı video ve çeşitli medya dosyalarının yanı sıra görüntü olarak da kullanılıyor.

Dosyaları Kova A'dan Kova B'ye Kopyalamak için AWS CLI Araçlarını Kullanma

A. Yeni kepçe oluşturun

$ aws s3 mb s3://new-bucket-name

B. Eski kovayı yeni kova ile senkronize edin

$ aws s3 sync s3://old-bucket-name s3://new-bucket-name

20.000'den fazla nesne kopyalanıyor ...

17:03

17:06 'de sona erdi

20.000+ nesne için toplam süre = yaklaşık 3 dakika

Yeni kova doğru bir şekilde yapılandırıldıktan sonra izinler, politikalar vb. Eski kovayı çıkarmak istersiniz.

C. Eski kovayı çıkarın / silin

$ aws s3 rb --force s3://old-bucket-name

Hayat kurtarıcı. 300 + GB kopya ediyorum. Bir ipucu: aynı bölgedeki kovalardan kopyalarsanız, diğer bölgelere göre çok daha hızlıdır (ve daha ucuzunu okudum).
Marcelo Agimóvel

Metodunuzla ilgili bir sorunum vardı: dosya gizliliği tümü ÖZEL olarak ayarlandı, nesnelerin çoğu halka açıktı, ne oldu?
Marcelo Agimóvel

5

Bunun en iyi yaklaşım olduğundan emin değilim, ancak AWS yönetim konsolunun bir kes / kopyala / yapıştır özelliği var. kullanımı çok kolay ve verimli.


6
Milyonlarca dosyayla iyi sonuç vermeyebilir.
James,

@James acı verici bir şekilde teyit edebilir;)
rob

3

Şu ana kadar muhtemelen iyi bir çözüm bulduğunuzu hayal ediyorum, ancak bu sorunla karşılaşan diğer kişiler için (az önce olduğu gibi), özellikle bir S3 kovasını diğerine yansıtmak amacıyla basit bir yardımcı program hazırladım. çok eşzamanlı, ancak CPU ve bellek verimli bir şekilde.

Burada Apache Lisansı altında github'da: https://github.com/cobbzilla/s3s3mirror

Denemeye karar verirseniz, herhangi bir geri bildirim varsa lütfen bana bildirin.


S3s3mirror ile harika bir deneyim yaşadım. Bir m1.small EC2 düğümüne kurmayı ve yaklaşık 2 saat içinde 1,5 milyon nesneyi kopyalamayı başardım. Maven ve Java'yı bilmediğim için kurulum biraz zordu, ancak Ubuntu'da her şeyin kurulmasını sağlamak için sadece birkaç apt-get komutu aldım. Son bir not: (benim gibi) büyük, önemli bir s3 kovasında bilinmeyen bir komut dosyası çalıştırma konusunda endişe duyuyorsanız, kopya kepçesinden salt okunur erişimi olan özel bir kullanıcı oluşturun ve bu bilgileri kullanın. Kazara silme şansı sıfır.
Micah,

Bu, farklı hesaplar arasındaki kovalara uygulanabilir mi?
Oliver Burdekin,

@OliverBurdekin evet bunu yapmak için bir --cross-account-copyseçenek var ( -Ckısaca). Hesaplar genelinde kopyalarken, ACL unutmayın değil kopyalanan; Hedef kovanın sahibi kopyalanan verilere tam izin verecek.
cobbzilla

Thanks @ rfcreader Bunun maliyetini nasıl tahmin edebilirim? AWS maliyet hesaplayıcısının farkındayım, ancak bu işlemin istekleri yerine getirme sayısı açısından neleri içereceği hakkında hiçbir fikrim yok, bu ölçümleri CLI kullanarak saymanın oldukça kolay olduğunu düşünüyorum, ancak daha fazlasını biliyorsanız lütfen bizimle iletişime geçin. AWS desteği "talep eden kişi öder" önerdi. Ha!
Oliver Burdekin,

@OliverBurdekin s3s3mirror, türüne göre AWS isteklerinin sayısını (GET, COPY, DELETE, vb.) İzler. Bu istatistikler, çalışırken düzenli aralıklarla ve en sonuncusu da bir kez basılır. Nesnelerin küçük bir alt kümesini kopyalamak için sınırlı bir deneme / deneme çalışması yapabilirsiniz, bu size tüm veri setini kopyalamak için kaç toplam isteğin gerekli olacağı hakkında genel bir fikir vermelidir.
cobbzilla

2

AWS CLI, paralel işlemlerde bir kovayı diğerine kopyalamanın bir yolunu sağlar. Alındığı https://stackoverflow.com/a/40270349/371699 :

Aşağıdaki komutlar AWS CLI'ye işleri yürütmek için 1.000 iş parçacığı kullanmasını söyleyecektir (her biri küçük bir dosya ya da çok parçalı bir kopyanın bir kısmı) ve 100.000 işin önüne bakacak:

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

Bunları çalıştırdıktan sonra, basit senkronizasyon komutunu aşağıdaki gibi kullanabilirsiniz:

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

Bir m4.xlarge makinesinde (AWS - 4 çekirdekte, 16 GB RAM'de), benim durumumda (3-50 GB dosyalar), eşitleme / kopyalama hızı yaklaşık 9.5MiB / s'den 700 + MiB / s'ye çıktı. Varsayılan yapılandırma üzerinden 70x.


0

Kaybedilen kovada, başka bir kovaya kopyalamak istediğiniz dosyaları seçin.

  • Eylemler altında 'Kopyala'yı seçin.
  • Kazanç kovasına git.
  • Eylemler altında 'Yapıştır'ı seçin

1
Neden bir yıl önce başkalarının söylediği bir çözümü tekrar etmelisiniz?
Benjamin
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.