web-dev-qa-db-fra.com

Est-il possible d'effectuer un téléchargement par lots sur Amazon s3?

Amazon s3 prend-il en charge les téléchargements par lots? J'ai une tâche qui doit être téléchargée chaque nuit: environ 100 000 fichiers pouvant aller jusqu'à 1 G mais fortement orientés vers les petits fichiers (90% ont moins de 100 octets et 99% ont moins de 1000 octets de long).

L'API s3 prend-elle en charge le téléchargement de plusieurs objets dans un seul appel HTTP?

Tous les objets doivent être disponibles dans S3 en tant qu'objets individuels. Je ne peux pas les héberger ailleurs (FTP, etc.) ou dans un autre format (base de données, lecteur local EC2, etc.). C'est une exigence externe que je ne peux pas changer.

50
flybywire

L'API s3 prend-elle en charge le téléchargement de plusieurs objets dans un seul appel HTTP?

Non, l'opération S3 PUT ne prend en charge que le téléchargement d'un objet par requête HTTP. 

Vous pouvez installer Outils S3 sur votre ordinateur que vous souhaitez synchroniser avec le compartiment distant et exécuter la commande suivante:

s3cmd sync localdirectory s3://bucket/

Vous pouvez ensuite placer cette commande dans un script et créer un travail planifié pour exécuter cette commande chaque nuit.

Cela devrait faire ce que vous voulez. 

L'outil effectue la synchronisation de fichier en fonction des hachages MD5 et de la taille du fichier. La collision doit donc être rare (si vous le souhaitez vraiment, vous pouvez simplement utiliser la commande "s3cmd put" pour forcer le remplacement en aveugle d'objets dans votre compartiment cible).

EDIT: Assurez-vous également de lire la documentation sur le site que j'ai lié pour les outils S3 - différents indicateurs sont nécessaires pour indiquer si vous souhaitez que les fichiers supprimés localement soient supprimés du compartiment ou ignorés, etc.

29
Ryan Weir

Vous pouvez également télécharger S3 via Outil AWS CLI à l'aide de la commande sync.

aws s3 sync dossier_local s3: // nom de compartiment 

Vous pouvez utiliser cette méthode pour télécharger des fichiers par lots vers S3 très rapidement.

38
RubyFanatic

Pour ajouter à ce que tout le monde dit, si vous voulez que votre code Java (au lieu de la CLI) le fasse sans avoir à mettre tous les fichiers dans un seul répertoire, vous pouvez créer une liste de fichiers à télécharger, puis les fournir. liste à la méthode uploadFileList d’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.lang.String-Java. io.File-Java.util.List-

0
Samuel Dominguez

Un fichier (ou une partie de fichier) = une requête HTTP, mais l'API Java prend désormais en charge le téléchargement efficace de plusieurs fichiers sans avoir à écrire le multithreading par vous-même, en utilisant TransferManager

0
Oren

Si vous voulez utiliser le programme Java pour le faire, vous pouvez faire:

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();
    }
}

La création de s3client et du gestionnaire de transfert pour vous connecter à S3 local si vous souhaitez tester est la suivante

    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
Saurabh Valsangkar