Frage Welches ist der schnellste Weg, um 400 GB Dateien von einem ec2 elastischen Blockspeichervolumen nach s3 zu kopieren?


Ich muss 400G Dateien von einem elastischen Blockspeichervolumen in einen s3 Eimer kopieren ... Das sind ungefähr 300k Dateien von ~ 1Mb

ich habe es versucht s3cmd und s3fuseBeide sind wirklich, wirklich langsam .. s3cmd lief für einen ganzen Tag, sagte, es ist fertig mit dem Kopieren, und als ich den Eimer überprüfte, war nichts passiert (ich nehme an, etwas ist schiefgelaufen, aber wenigstens hat s3cmd sich nie über irgendetwas beschwert)

S3Fuse arbeitet für einen anderen kompletten Tag und kopierte weniger als 10% der Dateien ...

Gibt es dafür eine bessere Lösung?

Ich betreibe natürlich Linux (ubuntu 12.04)


21
2018-05-08 01:47


Ursprung


Viele Benchmarks (z.B. dieses) haben 3 Bestimmungsfaktoren für den Durchsatz zu S3 gezeigt: 1) Dateigröße 2) Anzahl der parallelen Threads und 3) Instanzgröße. Zwischen 64 und 128 parallelen (simultanen) Uploads von 1 MB-Objekten sollten den 1 Gbit / s-Uplink, den eine m1.xlarge hat, sättigen und sollten sogar den 10-Gbit / s-Uplink einer Cluster-Compute (cc1.4xlarge) -Instanz sättigen. Es sollte viele Skripte in diesem Sinne geben (z.B. dieses oder s3cmd-Modifikation) - cyberx86
s3-parallel-put hat es geschafft! - aseba


Antworten:


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

  • Dateigröße - kleinere Dateien erfordern eine größere Anzahl von Anfragen und mehr Overhead und Transfer langsamer. Die Verstärkung mit der Dateigröße (wenn sie von EC2 stammt) ist für Dateien größer als 256kB vernachlässigbar. (Während die Übertragung von einem entfernten Standort mit höherer Latenz tendenziell weiterhin deutliche Verbesserungen bis zwischen 1MB und 2MB zeigt).
  • Anzahl der parallelen Threads - ein einzelner Upload-Thread hat in der Regel ziemlich niedrige Werte - oft unter 5MiB / s. Der Durchsatz steigt mit der Anzahl der gleichzeitigen Threads und neigt dazu, zwischen 64 und 128 Threads einen Höchstwert zu erreichen. Es sollte beachtet werden, dass größere Instanzen in der Lage sind, eine größere Anzahl gleichzeitiger Threads zu verarbeiten.
  • Instanzgröße - Gemäß der Instanzspezifikationengrößere Instanzen haben dediziertere Ressourcen, einschließlich einer größeren (und weniger variablen) Zuweisung der Netzwerkbandbreite (und I / O im Allgemeinen - einschließlich des Lesens von ephemeren / EBS-Festplatten), die an das Netzwerk angeschlossen sind. Typische Zahlenwerte für jede Kategorie sind:
    • Sehr hoch: Theoretisch: 10 Gbps = 1250 MB / s; Realistisch: 8,8 GBit / s = 1100 MB / s
    • Hoch: Theoretisch: 1 Gbit / s = 125 MB / s; Realistisch: 750Mbps = 95MB / s
    • Moderat: Theoretisch: 250Mbps; Realistisch: 80Mbps = 10MB / s
    • Niedrig: Theoretisch: 100 Mbit / s; Realistisch: 10-15Mbps = 1-2MB / s

In Fällen, in denen große Datenmengen übertragen werden, kann es wirtschaftlich sinnvoll sein, eine Cluster-Recheninstanz zu verwenden, da der effektive Durchsatzzuwachs (> 10x) mehr ist als der Unterschied in den Kosten (2-3x).

Während die obigen Ideen ziemlich logisch sind (obwohl die Pro-Thread-Obergrenze nicht sein kann), ist es ziemlich einfach, Benchmarks zu finden, die sie sichern. Eine besonders detaillierte kann gefunden werden Hier.

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

Es ist zwar relativ einfach, die Instanzgröße zu ändern, die anderen beiden Faktoren sind jedoch möglicherweise schwieriger zu verwalten.

  • Die Dateigröße ist normalerweise fest - wir können Dateien auf EC2 nicht zusammenfügen und sie auf S3 teilen lassen (daher können wir nicht viel mit kleinen Dateien machen). Große Dateien jedoch können wir auf der EC2-Seite teilen und auf der S3-Seite wieder zusammensetzen (unter Verwendung von S3s mehrteiligem Upload). Dies ist in der Regel vorteilhaft für Dateien, die größer als 100 MB sind.
  • Parallele Threads sind etwas schwieriger zu bedienen. Der einfachste Ansatz besteht darin, einen Wrapper für ein vorhandenes Upload-Skript zu schreiben, das mehrere Kopien gleichzeitig ausführt. Bessere Ansätze verwenden die API direkt, um etwas Ähnliches zu erreichen. Wenn man bedenkt, dass der Schlüssel parallele Anfragen sind, ist es nicht schwierig, mehrere potentielle Skripte zu finden, zum Beispiel:
    • s3cmd-Modifikation - eine Abzweigung einer früheren Version von s3cmd, die 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

20
2018-05-09 01:31





Also, nach vielen Tests s3-parallel-put hat den Trick super gemacht. Klar die Lösung, wenn Sie viele Dateien auf S3 hochladen müssen. Dank an cyberx86 für die Kommentare.


8
2018-05-08 14:28



Aus Neugier, a) wie lange dauerte es, um die 400 GB hochzuladen b) wie viele Threads hast du benutzt c) welche Instanzgröße hast du benutzt? - cyberx86
@ Cyberx86 Ich habe kürzlich s3-parallel-auf eine große Ec2-Instanz gesetzt. Ich benutzte 5 Threads und kopierte 288.73 GB in 10.49 Stunden. - Gortron


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

Im Folgenden wurde die Synchronisierungsgeschwindigkeit S3 um mindestens das 8-fache erhöht!

Beispiel:

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

4
2017-08-24 20:19





Ich habe eine optimierte Konsolenanwendung in C # geschrieben (CopyFasterToS3) um dies zu tun. Ich benutzte in EBS vol, ich mein Fall es hatte 5 Ordner mit mehr als 2 Millionen Dateien in einer Menge von 20 GB. Das Skript wurde in weniger als 30 Minuten ausgeführt.

Im Dieser Beitrag Ich habe gezeigt, wie man eine rekursive Funktion mit parallel verwendet. Sie können es in eine andere Sprache transkribieren.

Viel Glück!


2
2018-03-12 20:43





Es gibt auch: s3Funnel, die sehr alt (2008) und einige offene Bugs scheint, aber immer noch von Amazon selbst aufgeführt ist: amzn-lnk


1
2017-07-07 07:47





Versuchen Sie stattdessen s4cmd, es ist wirklich schneller als s3cmd. Seine Adresse: https://github.com/bloomreach/s4cmd


1
2018-03-28 05:25





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

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


1
2018-06-16 05:06