it-swarm.com.de

Kann ich einen Batch-Upload zu Amazon S3 durchführen?

Unterstützt Amazon S3 Batch-Uploads? Ich habe einen Job, der jede Nacht hochgeladen werden muss ~ 100.000 Dateien, die bis zu 1 G groß sein können, aber stark auf kleine Dateien ausgerichtet sind (90% sind weniger als 100 Byte und 99% sind weniger als 1000 Byte lang).

Unterstützt die S3-API das Hochladen mehrerer Objekte in einem einzigen HTTP-Aufruf?

Alle Objekte müssen in S3 als Einzelobjekte verfügbar sein. Ich kann sie nirgendwo anders hosten (FTP usw.) oder in einem anderen Format (Datenbank, lokales EC2-Laufwerk usw.). Das ist eine äußere Anforderung, die ich nicht ändern kann.

50
flybywire

Unterstützt die S3-API das Hochladen mehrerer Objekte in einem einzigen HTTP-Aufruf?

Nein, die S3-PUT-Operation unterstützt nur das Hochladen eines Objekts pro HTTP-Anforderung. 

Sie können S3 Tools auf Ihrem Computer installieren, den Sie mit dem Remote-Bucket synchronisieren möchten, und den folgenden Befehl ausführen:

s3cmd sync localdirectory s3://bucket/

Dann können Sie diesen Befehl in ein Skript einfügen und einen geplanten Job erstellen, um diesen Befehl jede Nacht auszuführen.

Dies sollte tun, was Sie wollen. 

Das Tool führt die Dateisynchronisierung auf der Grundlage von MD5-Hashes und Dateigröße durch. Daher sollte eine Kollision selten sein (wenn Sie wirklich wollen, können Sie einfach den Befehl "s3cmd put" verwenden, um ein blindes Überschreiben von Objekten in Ihrem Zielbehälter zu erzwingen).

BEARBEITEN: Stellen Sie außerdem sicher, dass Sie die Dokumentation auf der Site lesen, die ich für S3 Tools verlinkt habe. Es gibt verschiedene Flags, um zu bestimmen, ob Dateien lokal aus dem Bucket gelöscht oder ignoriert werden sollen.

29
Ryan Weir

Alternativ können Sie S3 über AWS CLI-Tool mit dem Befehl sync hochladen.

aws s3 sync local_folder s3: // Bucket-Name 

Sie können diese Methode verwenden, um Dateien im Batch sehr schnell in S3 hochzuladen.

38
RubyFanatic

Wenn Sie möchten, dass Ihr Java-Code (anstelle der CLI) dies tun soll, ohne alle Dateien in einem einzigen Verzeichnis speichern zu müssen, können Sie eine Liste der Dateien zum Hochladen erstellen und diese dann bereitstellen Liste der uploadFileList-Methode von AWS TransferManager.

https://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferManager.html#uploadFileList-Java.lang.String-Java.lang.String-Java. io.File-Java.util.List-

0

Eine Datei (oder ein Teil einer Datei) = eine HTTP-Anforderung, aber die Java-API unterstützt jetzt den effizienten Upload mehrerer Dateien, ohne das Multithreading selbst schreiben zu müssen, indem Sie TransferManager verwenden.

0
Oren

Wenn Sie das Java-Programm verwenden möchten, können Sie Folgendes tun:

public  void uploadFolder(String bucket, String path, boolean includeSubDirectories) {
    File dir = new File(path);
    MultipleFileUpload upload = transferManager.uploadDirectory(bucket, "", dir, includeSubDirectories);
    try {
        upload.waitForCompletion();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

Die Erstellung von s3client und des Transfermanagers für die Verbindung zum lokalen S3, wenn Sie testen möchten, ist wie folgt:

    AWSCredentials credentials = new BasicAWSCredentials(accessKey, token);
    s3Client = new AmazonS3Client(credentials); // This is deprecated but you can create using standard beans provided by spring/aws
    s3Client.setEndpoint("http://127.0.0.1:9000");//If you wish to connect to local S3 using minio etc...
    TransferManager transferManager = TransferManagerBuilder.standard().withS3Client(s3Client).build();
0