das hochladen und komprimieren Datei zu s3
Ich habe vor kurzem begonnen arbeiten mit S3 und haben sich über diese Notwendigkeit, um das hochladen und komprimieren große Dateien (10 gb +-) auf s3.
Die aktuelle Umsetzung mit dem ich arbeite, ist das erstellen einer temp-komprimierte Datei lokal und dann hochladen auf s3 und schließlich das löschen der temp-Datei. Die Sache ist, für eine 10 gb Datei, ich habe fast 20 gb lokal gespeichert, bis der upload fertig ist. Ich brauche einen Weg, um die übertragung der Datei zu s3 und dann komprimieren es.
Ist dieser Ansatz tragfähig? Wenn ja,wie soll ich den anderen das? Wenn nicht, gibt es eine Möglichkeit, kann ich das minimieren der lokalen Speicherplatz benötigt?
Ich habe jemanden gesehen, sugesting, dass die Datei konnten hochgeladen werden, S3, heruntergeladen, um eine EC2-in der gleichen region, es komprimiert und dann hochgeladen, zurück zu den S3 beim löschen der ersten Kopie auf S3. Dies könnte funktionieren, aber es scheint mir, dass 2 uploads für geting eine Datei wäre nicht von Vorteil costwise.
Ich habe versucht, laden Sie eine Komprimierung-stream ohne Erfolg, aber ich habe gerade entdeckt, s3 unterstützt keine Komprimierung und streaming jetzt bin ich ratlos wie es weitergehen soll.
Ich bin mit dem gzip-Bibliothek auf .NET
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der linux-shell, über aws-cli, dies wurde Hinzugefügt, etwa 3 Monate nachdem Sie die Frage gestellt 🙂
Hinzugefügt wurde die Fähigkeit zum streamen von Daten mit
cp
So dass die beste Sie tun können, denke ich, ist die pipe die Ausgabe von gzip zu aws cli:
Hochladen von stdin:
gzip -c big_file | aws s3 cp - s3://bucket/folder/big_file.gz
Download auf stdout:
aws s3 cp s3://bucket/folder/big_file.gz - | gunzip -c ...
Wenn Raum an einer Prämie an die Stelle, wo Sie zunächst die Datei, dann das hochladen der Datei zu S3, und anschließend herunterladen, entpacken und wieder hochladen der Datei auf S3 auf einer EC2-instance in derselben region wie das S3-bucket ist eigentlich eine sehr sinnvolle (wenn scheinbar counter-intuitive) Vorschlag, aus einem einfachen Grund:
AWS keine Gebühren für Bandbreite zwischen EC2 und S3 in der gleichen region.
Dies ist ein Idealer job für eine spot-instance... und ein guter use-case für SQS zu sagen, der spot Maschine, was getan werden muss.
Auf der anderen Seite..., Sie verbringen mehr von Ihrer lokalen Bandbreite Upload, dass die Datei, wenn Sie nicht komprimieren ersten.
Wenn Sie ein Programmierer sind, sollten Sie in der Lage sein Handwerk, ein Dienstprogramm, ähnlich der, die ich geschrieben habe, für den internen Gebrauch (dies ist kein plug; es ist zurzeit nicht verfügbar zum release), die komprimiert (über externe tools) und uploads von Dateien auf S3 on-the-fly.
Funktioniert es so etwas wie dieser pseudocode Beispiel-Befehlszeile:
Das ist ein Vereinfachtes Beispiel, um das Konzept zu zeigen. Natürlich, mein "stream-to-s3" - Programm akzeptiert eine Reihe von anderen Argumenten, einschließlich der x-amz-meta-Metadaten, die aws access key und secret, aber Sie bekommen die Idee, vielleicht.
Gängigen Kompressions-Tools wie gzip, pigz, bzip2 pbzip2, xz, und pixz alle Lesen können, die Quelle-Datei aus
STDIN
und schreiben der komprimierten Daten, umSTDOUT
ohne jemals schreiben wird die komprimierte version der Datei auf der Festplatte.Den utility verwende ich die Datei liest die Daten aus Ihren
STDIN
über die pipeline, und mit S3-Multipart-Upload (auch bei kleinen Dateien, die nicht technisch müssen Sie, weil die S3-Multipart-Upload geschickt müssen Sie nicht wissen, die Größe der Datei im Voraus), es hält nur das senden von Daten an S3 bisEOF
auf den Eingabe-stream. Dann schließt es die multipart-upload und sorgt dafür, dass alles gelungen ist.Ich dieses Dienstprogramm verwenden, um erstellen und hochladen komplette tarballs, mit Kompression, ohne jemals das berühren eines einzigen block von Speicherplatz. Wieder war es nicht besonders schwer zu schreiben, und hätte getan werden können in einer Reihe von Sprachen. Ich habe nicht einmal irgendwelche S3-SDK, ich rollte meine eigenen von Grund auf, mit einem standard-HTTP-user-agent und die S3-API-Dokumentation.
Dieser Ansatz ist nicht tragfähig/nicht optional. Die Kompression nimmt eine Menge der CPU-Ressourcen, und Amazon S3 ist in das Geschäft der Speicherung von Daten, die nicht durchführen heavy duty Verarbeitung Ihrer Dateien.
Mit S3 sind Sie auch bezahlen Bandbreite für das, was Sie hochladen, so dass Sie verschwenden Geld senden mehr Daten müssen dann werden.
Was Sie tun können, ist ein upload direkt zu EC2, komprimieren Sie es, und laden Sie dann zu S3 von dort. Aber jetzt haben Sie sich Ihre 20-GB-problem von der lokalen Maschine, auf der EC2-Instanz.
Der beste Ansatz ist weiterhin mit Ihrem aktuellen Ansatz der lokal komprimieren und dann hochladen.
Wenn Sie mit .NETTO könnte man einen char stream, aber Sie müssten auch noch einige lokale Speicher, die größer als 20 GB.
Zusätzlich werden die überbringer schlechter Nachrichten S3 von amazon ist nur die Lagerung. Müssen Sie möglicherweise zu drehen, bis ein anderer Dienst (aws) als ein Programm ausführen kann, das komprimieren kann auf die Lagerung. Damit Ihre app hochgeladen und komprimiert mit dem S3-Speicher.
Wenn euer Projekt kleiner ist, möchten Sie vielleicht zu prüfen, eine IaaS-Anbieter eher als PaaS. So Speicher-und app kann werden auf den gleichen Servern.
Ein sehr wichtiger S3-Funktion für den upload-Durchsatz parallele hochladen. Es gibt mehrere tools, die das tut, wie aws cli, s3cmd oder crossftp. Aus einer .NET-API, das gleiche kann erreicht werden durch die
TransferUtility
KlasseWenn Sie wirklich brauchen, Kompression, werfen Sie einen Blick auf S3DistCP, ein tool, das tun können, übertragungen über mehrere Maschinen parallel und komprimieren on-the-fly.