Frage Wie man Dateien mit minimalem Aufwand zwischen zwei S3-Buckets verschiebt?


Ich habe Millionen von Dateien in einem Amazon S3-Bucket und möchte diese Dateien mit minimalem Aufwand oder ohne Kosten in andere Buckets und Ordner verschieben. Alle Eimer befinden sich in derselben Zone.

Wie könnte ich es tun?


39
2018-01-12 22:33


Ursprung




Antworten:


Millionen sind eine große Zahl - darauf komme ich später zurück.

Unabhängig von Ihrem Ansatz muss der zugrundeliegende Mechanismus direkt von einem Bucket in einen anderen kopieren - auf diese Weise entstehen (da Ihre Buckets in der gleichen Region liegen) keine Gebühren für die Bandbreite. Jeder andere Ansatz ist einfach ineffizient (z. B. Herunterladen und erneutes Hochladen der Dateien).

Das Kopieren zwischen Buckets erfolgt über 'PUT copy' - das ist eine PUT-Anfrage, die den Header 'x-amz-copy-source' enthält - ich glaube, das ist eine COPY-Anfrage. Dies kopiert die Datei und standardmäßig die zugehörigen Metadaten. Sie müssen ein "x-amz-acl" mit dem richtigen Wert einschließen, wenn Sie die ACL gleichzeitig festlegen möchten (andernfalls wird sie standardmäßig auf "privat" gesetzt). Ihnen werden Ihre COPY-Anfragen in Rechnung gestellt (0,01 $ / 1.000 Anfragen). Sie können die nicht benötigten Dateien nach dem Kopieren löschen (DELETE-Anfragen werden nicht berechnet). (Ein Punkt, auf den ich nicht ganz klar bin, ist, ob eine COPY-Anfrage auch die Gebühr einer GET-Anfrage enthält, da das Objekt zuerst aus dem Quell-Bucket geholt werden muss - wenn dies der Fall ist, wird die Gebühr zusätzliche $ 0,01 / 10.000 betragen Anfragen).

Die oben genannten Gebühren sind scheinbar unvermeidlich - für eine Million Objekte, die Sie sich ansehen, um $ 10 (oder $ 11). Da Sie am Ende tatsächlich die Dateien im Ziel-Bucket erstellen müssen, werden andere Ansätze (z. B. Tar-Gippen der Dateien, Amazon Import / Export usw.) diese Kosten nicht umgehen. Nichtsdestotrotz lohnt es sich, Amazon zu kontaktieren, wenn Sie mehr als ein paar Millionen Objekte übertragen möchten.

Angesichts des oben genannten (unvermeidbaren Preises) ist die nächste Sache, auf die man schauen muss, die Zeit, die ein großer Faktor beim Kopieren von "Millionen von Dateien" sein wird. Alle Tools, die die direkte Kopie zwischen Buckets ausführen können, werden mit der gleichen Gebühr belastet. Leider benötigen Sie eine Anforderung pro Datei (zum Kopieren), eine zu löschende Anforderung und möglicherweise eine Anforderung zum Lesen der ACL-Daten (wenn Ihre Dateien unterschiedliche ACLs aufweisen). Die beste Geschwindigkeit kommt von dem, was die meisten parallelen Operationen ausführen kann.

Es gibt einige Befehlszeilen-Ansätze, die durchaus sinnvoll sein können:

  • s3cmd-Modifikation (Diese spezifische Pull-Anfrage enthält parallele cp- und mv-Befehle und sollte eine gute Option für Sie sein.
  • Die AWS-Konsole kann die Kopie direkt ausführen - ich kann nicht dafür sprechen, wie parallel sie ist.
  • Tim Kay ist aws Skript kann die Kopie machen - aber es ist nicht parallel - Sie müssen es Skript, um die vollständige Kopie ausführen, die Sie wollen (wahrscheinlich nicht die beste Option in diesem Fall - obwohl es ein großartiges Skript ist).
  • CloudBerry S3 Explorer, Eimer-Forscher, und CloudBuddy sollten alle in der lage sein, die aufgabe zu erledigen, obwohl ich nicht weiß, wie sich die effizienz der einzelnen stapelt. Ich glaube jedoch, dass die Multi-Threaded-Funktionen der meisten davon den Kauf der Software erfordern.
  • Schreiben Sie Ihre eigenen mit einem der verfügbaren SDKs.

Es besteht die Möglichkeit, dass s3fs funktioniert - es ist ziemlich parallel, unterstützt Kopien zwischen dem gleichen Bucket - unterstützt KEINE Kopien zwischen verschiedenen Buckets, aber könnte Unterstützung bewegt sich zwischen verschiedenen Eimern.

Ich würde mit s3cmd-Modifikation beginnen und sehen, ob Sie damit Erfolg haben oder kontaktieren Sie Amazon für eine bessere Lösung.


51
2018-01-13 22:35



Bucket Explorer scheint für mich gut zu funktionieren (Dateien im Moment zwischen zwei Buckets verschieben) - Noodles
Wo ist das? aws s3 sync s3://source s3://destination sich einfügen? - Olivier Lalonde


Ich bin mir nicht sicher, ob dies der beste Ansatz ist, aber die AWS Management Console verfügt über eine Funktion zum Ausschneiden / Kopieren / Einfügen. sehr einfach zu bedienen und effizient.


5
2018-06-28 07:51



Mit einer Million Dateien funktioniert das wahrscheinlich nicht gut. - James
@James kann das schmerzlich bestätigen;) - rob


Ich könnte mir vorstellen, dass Sie wahrscheinlich schon eine gute Lösung gefunden haben, aber für andere, die dieses Problem (wie ich gerade erst) hatte, habe ich ein einfaches Dienstprogramm speziell für den Zweck entwickelt, einen S3-Bucket in einen anderen zu spiegeln eine hochgradig gleichzeitige, dennoch CPU- und speichereffiziente Art und Weise.

Es ist auf Github unter einer Apache-Lizenz hier: https://github.com/cobbzilla/s3s3mirror

Wenn Sie sich entscheiden, es auszuprobieren, lassen Sie mich bitte wissen, wenn Sie ein Feedback haben.


3
2018-05-17 01:12



Ich hatte eine tolle Erfahrung mit s3s3mirror. Ich konnte es auf einem m1.small EC2-Knoten einrichten und 1,5 Millionen Objekte in ungefähr 2 Stunden kopieren. Setup war ein wenig schwierig, weil ich nicht mit Maven und Java vertraut war, aber es brauchte nur ein paar apt-get-Befehle auf Ubuntu, um alles zu installieren. Eine letzte Anmerkung: Wenn Sie (wie ich) besorgt sind, ein unbekanntes Skript in einem großen, wichtigen s3-Bucket auszuführen, erstellen Sie einen speziellen Benutzer mit Lesezugriff auf den Copy-from-Bucket und verwenden Sie diese Anmeldeinformationen. Null Chance für versehentliches Löschen. - Micah
Kann dies auf Buckets zwischen verschiedenen Konten angewendet werden? - Oliver Burdekin
@OliverBurdekin ja da ist ein --cross-account-copy Möglichkeit (-C kurz) um dies zu tun. Beachten Sie, dass die ACLs beim Kopieren über mehrere Konten hinweg bestehen nicht kopiert; Der Besitzer des Ziel-Buckets verfügt über vollständige Berechtigungen für die kopierten Daten. - cobbzilla
Danke @rfcreader Wie kann ich die Kosten dafür abschätzen? Ich kenne den AWS-Kostenrechner, habe aber keine Ahnung, was dieser Prozess in Bezug auf die Anzahl der gets puts ls-Anfragen usw. bedeutet. Ich kann mir vorstellen, dass es ziemlich einfach ist, diese Messwerte mit CLI zu berechnen. AWS-Support schlug "Anforderer zahlt" vor. Ha! - Oliver Burdekin
@OliverBurdekin s3s3mirror verfolgt die Anzahl der AWS-Anfragen nach Typ (GET, COPY, DELETE usw.). Diese Statistiken werden regelmäßig beim Laufen und ein letztes Mal am Ende ausgedruckt. Sie können einen begrenzten / Testlauf ausführen, um eine kleine Teilmenge der Objekte zu kopieren. Dies sollte Ihnen ein allgemeines Gefühl geben, wie viele Gesamtanforderungen benötigt werden, um den gesamten Datensatz zu kopieren. - cobbzilla


Altes Thema, aber dies ist für alle, die dasselbe Szenario untersuchen. Zusammen mit der Zeit, die ich brauchte, für mehr als 20.000 Objekte. Wird auf AWS Linux / Centos ausgeführt, wobei jedes Objekt zum größten Teil aus Bildern besteht, zusammen mit einigen Videos und verschiedenen Mediendateien.

Verwenden der AWS-CLI-Tools zum Kopieren der Dateien von Bucket A nach Bucket B.

A. Erstellen Sie den neuen Bucket

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

B. Synchronisieren Sie den alten Bucket mit dem neuen Bucket 

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

Über 20.000 Objekte werden kopiert ...

Gestartet 17:03

Beendete 17:06

Gesamtzeit für mehr als 20.000 Objekte = ungefähr 3 Minuten

Sobald der neue Bucket richtig konfiguriert ist, wird z. Berechtigungen, Richtlinien usw. und Sie möchten den alten Bucket entfernen.

C. Entfernen / löschen Sie den alten Eimer

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

3
2018-06-01 08:56



Lebensretter. Ich kopiere 300 + GBs. Ein Tipp: Wenn du aus Eimern in derselben Region kopierst, ist das viel schneller als in einer anderen Region (und ich lese es weniger teuer). - Marcelo Agimóvel
Ich hatte ein Problem mit Ihrer Methode: Die Privatsphäre der Dateien war auf PRIVATE eingestellt, sogar die meisten Objekte waren öffentlich, was passierte? - Marcelo Agimóvel


Die AWS-CLI bietet eine Möglichkeit, einen Bucket in einem parallelen Prozess in einen anderen zu kopieren. Genommen von https://stackoverflow.com/a/40270349/371699:

Die folgenden Befehle weisen die AWS CLI an, 1.000 Threads zum Ausführen von Jobs zu verwenden (jeweils eine kleine Datei oder ein Teil einer mehrteiligen Kopie) und nach 100.000 Jobs zu suchen:

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

Nachdem Sie diese ausgeführt haben, können Sie den einfachen Synchronisierungsbefehl wie folgt verwenden:

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

Auf einer m4.xlarge Maschine (in AWS - 4 Kerne, 16GB RAM), für meinen Fall (3-50GB Dateien) ging die Sync / Copy Geschwindigkeit von ca. 9.5MiB / s auf 700 + MiB / s, eine Geschwindigkeitssteigerung von 70x über die Standardkonfiguration.


1
2018-03-21 14:10





Wählen Sie im verlierenden Bucket die Datei (en) aus, die Sie in einen anderen Bucket kopieren möchten.

  • Wählen Sie unter Aktionen 'Kopieren'.
  • Gehe zum Gewinnungseimer.
  • Wählen Sie unter Aktionen 'Einfügen'

0
2017-08-20 19:50



Warum eine Lösung wiederholen, die andere ein Jahr zuvor erwähnt haben? - Benjamin