Was ist der schnellste Weg, um 400G Dateien von einem ec2-Speicher für elastische Blöcke auf s3 zu kopieren?

21

Ich muss 400 g Dateien von einem Speicher-Volume mit elastischen Blöcken in einen S3-Eimer kopieren ... Das sind ungefähr 300 k Dateien mit ~ 1 MB

Ich habe s3cmd und s3fuse ausprobiert , beide sind sehr, sehr langsam. S3cmd lief einen ganzen Tag lang und sagte, dass der Kopiervorgang abgeschlossen ist. Als ich den Eimer überprüfte, war nichts passiert (ich nehme an, es ist etwas schiefgegangen, aber zumindest s3cmd hat sich nie über irgendetwas beschwert

S3Fuse arbeitet für einen weiteren ganzen Tag und hat weniger als 10% der Dateien kopiert ...

Gibt es dafür eine bessere Lösung?

Ich verwende natürlich Linux (Ubuntu 12.04)

aseba
quelle
2
Viele Benchmarks (z. B. dieser ) haben 3 bestimmende Durchsatzfaktoren für S3 aufgezeigt: 1) Dateigröße 2) Anzahl paralleler Threads und 3) Instanzgröße. Zwischen 64 und 128 parallele (gleichzeitige) Uploads von 1 MB großen Objekten sollten den 1-Gbit / s-Uplink einer m1.xlarge-Instanz sättigen und sogar den 10-Gbit / s-Uplink einer Cluster-Compute-Instanz (cc1.4xlarge) sättigen. In diesem Sinne sollte es viele Skripte geben (zB diese oder s3cmd-Modifikation)
cyberx86
1
s3-parallel-put hat es geschafft!
aseba

Antworten:

20

Es gibt mehrere Schlüsselfaktoren, die den Durchsatz von EC2 bis S3 bestimmen:

  • Dateigröße - kleinere Dateien erfordern eine größere Anzahl von Anforderungen und einen höheren Overhead und eine langsamere Übertragung. Der Gewinn mit Dateigröße (wenn er von EC2 stammt) ist für Dateien größer als 256 KB vernachlässigbar. (Während bei der Übertragung von einem entfernten Standort mit höherer Latenz weiterhin deutliche Verbesserungen zwischen 1 MB und 2 MB zu verzeichnen sind).
  • Anzahl paralleler Threads - ein einzelner Upload-Thread hat normalerweise durchgehend eine relativ geringe Anzahl - oft unter 5 MB / s. Der Durchsatz steigt mit der Anzahl der gleichzeitigen Threads und erreicht in der Regel Spitzenwerte zwischen 64 und 128 Threads. Es ist zu beachten, dass größere Instanzen eine größere Anzahl von Threads gleichzeitig verarbeiten können.
  • Instanzgröße - Gemäß den Instanzspezifikationen verfügen größere Instanzen über mehr dedizierte Ressourcen, einschließlich einer größeren (und weniger variablen) Zuweisung der Netzwerkbandbreite (und der E / A im Allgemeinen - einschließlich des Lesens von kurzlebigen / EBS-Festplatten - die mit dem Netzwerk verbunden sind Zahlenwerte für jede Kategorie sind:
    • Sehr hoch: Theoretisch: 10 Gbit / s = 1250 MB / s; Realistisch: 8,8 Gbit / s = 1100 MB / s
    • Hoch: Theoretisch: 1 Gbit / s = 125 MB / s; Realistisch: 750 Mbit / s = 95 Mbit / s
    • Moderat: Theoretisch: 250 Mbit / s; Realistisch: 80 Mbit / s = 10 Mbit / s
    • Niedrig: Theoretisch: 100 Mbit / s; Realistisch: 10-15 Mbit / s = 1-2 Mbit / s

Bei der Übertragung großer Datenmengen kann es wirtschaftlich sinnvoll sein, eine Cluster-Computing-Instanz zu verwenden, da der effektive Durchsatzgewinn (> 10x) mehr als die Kostendifferenz (2-3x) beträgt.

Während die obigen Ideen ziemlich logisch sind (obwohl die Obergrenze pro Thread möglicherweise nicht gilt), ist es ziemlich einfach, Benchmarks zu finden, die sie unterstützen. Eine besonders detaillierte kann hier gefunden werden .

Die Verwendung von 64 bis 128 parallelen (gleichzeitigen) Uploads von 1 MB großen Objekten sollte den 1-Gbit / s-Uplink einer m1.xlarge-Instanz und sogar den 10-Gbit / s-Uplink einer Cluster-Compute-Instanz (cc1.4xlarge) sättigen.

Die Instanzgröße lässt sich relativ einfach ändern, die beiden anderen Faktoren sind jedoch möglicherweise schwerer zu handhaben.

  • Die Dateigröße ist in der Regel festgelegt. In EC2 können keine Dateien zusammengefügt und in S3 aufgeteilt werden (daher können wir bei kleinen Dateien nicht viel tun). Große Dateien können jedoch auf der EC2-Seite aufgeteilt und auf der S3-Seite wieder zusammengesetzt werden (mithilfe des mehrteiligen Uploads von S3). In der Regel ist dies für Dateien von Vorteil, die größer als 100 MB sind.
  • Parallele Threads sind etwas schwieriger zu verarbeiten. Der einfachste Ansatz besteht darin, einen Wrapper für ein vorhandenes Upload-Skript zu schreiben, das mehrere Kopien davon gleichzeitig ausführt. Bessere Ansätze verwenden die API direkt, um etwas Ähnliches zu erreichen. Wenn man bedenkt, dass es sich bei dem Schlüssel um parallele Anforderungen handelt, ist es nicht schwierig, mehrere potenzielle Skripte zu finden, zum Beispiel:
    • s3cmd-modification - Ein Fork einer frühen Version von s3cmd, der diese Funktionalität hinzugefügt hat, aber seit einigen Jahren nicht mehr aktualisiert wurde.
    • s3-parallel-put - einigermaßen aktuelles Python-Skript, das gut funktioniert
cyberx86
quelle
8

Also, nach vielen Tests hat s3-parallel-put den Trick gewaltig gemacht. Ganz klar die Lösung, wenn Sie viele Dateien in S3 hochladen müssen. Danke an cyberx86 für die Kommentare.

aseba
quelle
3
Aus Neugier a) wie lange hat das Hochladen der 400 GB gedauert b) wie viele Threads haben Sie verwendet c) welche Instanzgröße haben Sie verwendet?
cyberx86
1
@ Cyberx86 Ich habe kürzlich s3-parallel-put für eine Large Ec2-Instanz verwendet. Ich habe 5 Threads verwendet und 288,73 GB in 10,49 Stunden kopiert.
Gortron
4

Optimieren Sie die AWS CLI S3-Konfigurationswerte gemäß http://docs.aws.amazon.com/cli/latest/topic/s3-config.html .

Das Folgende erhöhte eine S3-Synchronisationsgeschwindigkeit um mindestens das 8-fache!

Beispiel:

$ more ~/.aws/config
[default]
aws_access_key_id=foo
aws_secret_access_key=bar
s3 =
   max_concurrent_requests = 100
   max_queue_size = 30000
Fletcher
quelle
2

Ich habe dazu eine optimierte Konsolenanwendung in C # ( CopyFasterToS3 ) geschrieben. Ich habe in EBS vol verwendet, in meinem Fall hatte es 5 Ordner mit mehr als 2 Millionen Dateien in einer Größe von 20 GB. Das Skript wurde in weniger als 30 Minuten ausgeführt.

In diesem Artikel habe ich gezeigt, wie man eine rekursive Funktion parallel verwendet. Sie können es in eine andere Sprache übersetzen.

Viel Glück!

André Agostinho
quelle
1

Es gibt auch: s3funnel , der sehr alt (2008) und einige offene Fehler zu sein scheint, aber immer noch von Amazon selbst aufgelistet wird: amzn-lnk

Mathematik
quelle
1

Versuchen Sie es mit s3-cli anstelle von s3cmd. Ich habe es anstelle von s3cmd verwendet, um Dateien in meinen s3-Bucket hochzuladen, und es hat meine Bereitstellung um fast 17 Minuten beschleunigt (von 21 auf 4 Minuten)!

Hier ist der Link: https://github.com/andrewrk/node-s3-cli

Yahya
quelle