2011-10-11 5 views
10

Je me demande s'il est possible de chatter un fichier gzip stocké sur amazon s3. Peut-être en utilisant un client de streaming. Qu'est-ce que tu penses?zcat sur amazon s3

Nous sommes loking pour une opération similaire à zcat s3://bucket_name/your_file | grep "log_id"

Répondre

4

Pas exaclty un zcat, mais un moyen d'utiliser Hadoop pour télécharger des fichiers volumineux en parallèle de S3 pourrait être http://hadoop.apache.org/common/docs/current/distcp.html

Hadoop distcp s3: // YOUR_BUCKET/your_file/tmp/your_file

ou

hadoop distcp s3: // YOUR_BUCKET/your_file hdfs: // maître: 8020/your_file

Peut-être que de ce point vous pouvez un tuyau zcat ...

Pour ajouter vos informations d'identification que vous devez modifier le fichier de base-site.xml avec:

<configuration> 
<property> 
    <name>fs.s3.awsAccessKeyId</name> 
    <value>YOUR_KEY</value> 
</property> 
<property> 
    <name>fs.s3.awsSecretAccessKey</name> 
    <value>YOUR_KEY</value> 
</property> 
<property> 
    <name>fs.s3n.awsAccessKeyId</name> 
    <value>YOUR_KEY</value> 
</property> 
<property> 
    <name>fs.s3n.awsSecretAccessKey</name> 
    <value>YOUR_KEY</value> 
</property> 
</configuration> 
6

Vous pouvez également utiliser s3cat, une partie de Tim la boîte à outils de ligne de commande de Kay pour AWS:

http://timkay.com/aws/

pour obtenir l'équivalent de zcat FILENAME | grep "log_id", vous feriez:

> s3cat BUCKET/OBJECT | zcat - | grep "log_id"

6

De S3 REST API » Operations on Objects » GET Object:

Pour utiliser GET, vous devez avoir accès en lecture à l'objet. Si vous accordez l'accès READ à l'utilisateur anonyme, vous pouvez renvoyer l'objet sans utiliser d'en-tête d'autorisation.

Si tel est le cas, vous pouvez utiliser:

$ curl <url-of-your-object> | zcat | grep "log_id" 

ou

$ wget -O- <url-of-your-object> | zcat | grep "log_id" 

Cependant, si vous ne l'avez pas accordé un accès anonyme en lecture sur l'objet, vous devez créer et envoyer l'en-tête d'autorisation dans le cadre de la demande GET et cela devient un peu fastidieux à faire avec curl/wget. Heureusement pour vous, quelqu'un l'a déjà fait et c'est le Perl aws script by Tim Kay comme recommended by Hari. Notez que vous n'avez pas besoin de placer le script de Tim Kay sur votre chemin ou de l'installer (sauf de le rendre exécutable), à ​​condition d'utiliser les versions de commande commençant par aws, par exemple.

$ ./aws cat BUCKET/OBJECT | zcat | grep "log_id" 
2

Si votre système d'exploitation supporte (probablement), vous pouvez utiliser /dev/fd/1 pour la cible pour aws s3 cp:

aws s3 cp s3://bucket_name/your_file | zcat | grep log_id 

Il semble y avoir quelques octets de fuite après EOF, mais zcat et bzcat commodément juste écrire un avertissement au STDERR.

Je viens de confirmer que cela fonctionne en chargeant une DB décharges de S3 comme ce droit:

aws s3 cp s3://some_bucket/some_file.sql.bz2 /dev/fd/1 | bzcat -c | mysql -uroot some_db 

Tout cela avec rien mais les choses déjà sur votre ordinateur et les outils officiels AWS CLI. Gagner.

0

Vous devez essayer d'utiliser s3streamcat, il prend en charge les fichiers compressés bzip, gzip et xz.

installés avec

sudo pip install s3streamcat Utilisation

Utilisation:

s3streamcat s3://bucketname/dir/file_path 
s3streamcat s3://bucketname/dir/file_path | more 
s3streamcat s3://bucketname/dir/file_path | grep something 
1

trouvé ce fil aujourd'hui, et aimé la réponse de Keith. Avance rapide à aujourd'hui cli aws c'est fait avec:

aws s3 cp s3://some-bucket/some-file.bz2 - | bzcat -c | mysql -uroot some_db 

Pourrait sauver quelqu'un d'autre un peu de temps.