le téléchargement et la compression de fichiers pour s3
J'ai récemment commencé à travailler avec les S3 et avons rencontré ce besoin de télécharger et de compresser les fichiers volumineux (10 go +-) à s3.
L'implémentation actuelle, je travaille avec la création d'un temp fichier compressé en local puis de la charger sur s3 et enfin la suppression du fichier temporaire. La chose est, pour un 10 go de fichiers, j'ai presque 20 go en local stockées jusqu'à ce que le téléchargement est terminé. J'ai besoin d'un moyen de transférer le fichier sur s3 et puis le compresser.
Cette approche est-elle viable? Si oui,comment dois-je résoudre? Si non, est-il possible que je peux minimiser les locaux de l'espace nécessaire?
J'ai vu quelqu'un sugesting que le fichier de petit plus ponctuellement être téléchargés sur le S3, téléchargé sur un EC2 dans la même région, comprimé et puis il y en téléchargés vers le S3 lors de la suppression de la première copie sur S3. Cela pourrait fonctionner, mais il me semble que 2 téléchargement pour geting un fichier ne serait pas un avantage costwise.
J'ai essayé de télécharger une compression de flux sans succès, mais je viens de découvrir s3 ne prend pas en charge la compression de streaming et maintenant je suis paumé comme façon de procéder.
Je suis en utilisant le gzip bibliothèque .NET
OriginalL'auteur VmLino | 2014-06-05
Vous devez vous connecter pour publier un commentaire.
Dans le shell linux, via aws-cli, il a été ajouté environ 3 mois après avoir posé la question 🙂
Ajout de la possibilité de flux de données à l'aide de
cp
Donc le mieux que vous pouvez faire, je suppose, est de canaliser la sortie de l'utilitaire gzip pour aws cli:
Télécharger à partir de stdin:
gzip -c big_file | aws s3 cp - s3://bucket/folder/big_file.gz
Télécharger sur stdout:
aws s3 cp s3://bucket/folder/big_file.gz - | gunzip -c ...
OriginalL'auteur Ferdinand.kraft
Si l'espace est à une prime à l'endroit où vous avez initialement le fichier, puis de télécharger le fichier pour le S3, et par la suite de télécharger, de compression et de re-télécharger le fichier de S3 sur une instance EC2 dans la même région que le compartiment S3 est en fait un très judicieux (si apparemment contre-intuitif) suggestion, pour une raison simple:
AWS ne vous facture pas pour de la bande passante entre EC2 et S3 au sein de la même région.
C'est un travail idéal pour un spot exemple... et un bon cas d'utilisation pour les SQS à dire à l'endroit de la machine ce qui doit être fait.
d'autre part... vous serez en mesure de dépenser plus de votre bande passante en téléchargeant ce fichier si vous n'avez pas le compresser d'abord.
Si vous êtes un programmeur, vous devriez être en mesure de concevoir un utilitaire similaire à celui que j'ai écrit. pour une utilisation interne (ce n'est pas un plug; il n'est actuellement pas disponible pour la libération) qui comprime (via des outils externes) et télécharge les fichiers de S3 à la volée.
Il fonctionne quelque chose comme ce pseudo-code de ligne de commande exemple:
C'est une utilisation simplifiée exemple, pour illustrer le concept. Bien sûr, mon "stream-à-s3" utilitaire accepte un certain nombre d'autres arguments, y compris les x-amz-méta-métadonnées, la clé d'accès aws et secret, mais vous voyez l'idée, peut-être.
Commune utilitaires de compression comme gzip, pigz, bzip2, pbzip2, xz, et pixz tous ne peuvent pas lire le fichier source de
STDIN
et écrire les données compressées àSTDOUT
sans jamais écrit la version compressée du fichier sur le disque.- Je utiliser l'utilitaire lit le fichier de données à partir de son
STDIN
via le pipeline, et, à l'aide de S3 Multipart Télécharger (même pour de petits fichiers qui ne sont pas techniquement besoin, parce que S3 Multipart Télécharger habilement ne nécessite pas de connaître la taille du fichier à l'avance), il ne cesse d'envoyer des données à S3 jusqu'à ce qu'il atteigneEOF
sur ses flux d'entrée. Ensuite, il complète le multipart télécharger et assure que tout a réussi.- Je utiliser cet utilitaire pour générer et télécharger ensemble des archives, avec la compression, sans jamais toucher un seul bloc d'espace disque. Encore une fois, il n'était pas particulièrement difficile à écrire, et pourrait avoir été fait dans un certain nombre de langues. Je n'ai même pas utiliser n'importe S3 SDK, j'ai roulé ma propre à partir de zéro, en utilisant une norme HTTP user agent et le S3 documentation de l'API.
Ce que je voulais dire, c'est que je ne pouvais pas le comprimer pendant le téléchargement. Un fichier compressé télécharge l'amende juste. Donc, si j'ai bien lu, votre code parvient à lire un filestream, compresser et de les télécharger avec multipart (je suis familier avec cette fonction) sans jamais utiliser un fichier temporaire?
Je vois. Et c'est ce que je fais, téléchargement d'un fichier est compressé, mais je vais le faire comme l'algorithme de compression qui me nourrit, c'données compressées sur le tuyau.
J'ai essayé de compresser et de les nourrir en plusieurs parties avec un flux contenant les données compressées. La chose est, je n'ai pas réussi à garder le flux et fini avec 3 corrompu .gz fichiers, cause de plusieurs parties fermées de chaque partie dans un fichier. Peut-être que j'ai foiré le code à un certain point. Et après j'ai eu mon patron me raconter comment vous ne pouvez pas compresser partiellement le fichier, puis mettre le tout ensemble, j'ai pensé que je pourrait venir ici pour obtenir de l'aide. Il est curieux de voir quelque chose de si semblable à ma première approche ici.
Un multipart télécharger ne voulut jamais, éventuellement de créer un fichier (objet) dans S3, donc si vous en quelque sorte retrouvé avec 3 fichiers, ce serait une faille de sécurité dans votre mise en œuvre, plutôt que dans le principe général de ce que vous essayiez.
OriginalL'auteur Michael - sqlbot
Cette approche n'est pas viable/pas une option. La Compression prend beaucoup de ressources PROCESSEUR, et Amazon S3 est une entreprise de stockage de données, de ne pas effectuer de lourds traitement de vos fichiers.
Avec S3, vous payez également de la bande passante pour ce que vous téléchargez, vous perdez de l'argent d'envoyer plus de données doivent ensuite être.
Ce que vous pourriez faire est de télécharger directement sur EC2, compresser, puis de les télécharger pour les S3 à partir de là. Mais maintenant que vous avez déplacé votre 20GB problème de local sur la machine, à l'instance EC2.
La meilleure approche est de continuer à utiliser votre approche actuelle de comprimer localement et ensuite de les télécharger.
OriginalL'auteur Martin Konecny
Si vous êtes en utilisant .NET, vous pouvez faire un char stream, mais vous auriez encore besoin de quelques local de stockage de plus de 20 GO.
En plus d'être le porteur de mauvaises nouvelles S3 d'amazon est juste de stockage. Vous devrez peut-être tourner un autre service (aws) que peut exécuter un programme qui permet de compresser sur le périphérique de stockage. Ainsi, votre application télécharge et comprime à l'aide de la S3 de stockage.
Si votre projet est plus petite, vous pourriez envisager d'utiliser un fournisseur d'IaaS plutôt que de PaaS. De cette façon, le stockage et l'application peut être sur le même ensemble de serveurs.
OriginalL'auteur Kyle_at_NU
Un très important S3 fonctionnalité pour télécharger le débit est parallèle à télécharger. Il existe plusieurs outils qui fait que, comme aws cli, s3cmd ou crossftp. À partir d'un .NET de l'API, la même chose pourrait être réalisé à l'aide de la
TransferUtility
classeSi vous avez vraiment besoin de compression, de prendre un coup d'oeil à S3DistCP, un outil qui peut faire des transferts à l'aide de plusieurs machines en parallèle et de compresser à la volée.
OriginalL'auteur faermanj