2011-10-11 47 views
10

Me pregunto si es posible cazar un archivo gzip almacenado en amazon s3. Tal vez usando algún cliente de streaming. ¿Qué piensas?zcat en amazon s3

Estamos buscando el una operación similar a zcat s3://bucket_name/your_file | grep "log_id"

Respuesta

4

No exaclty una zcat, sino una manera de utilizar Hadoop para descargar archivos de gran tamaño en paralelo desde S3 podría ser http://hadoop.apache.org/common/docs/current/distcp.html

hadoop distcp s3: // YOUR_BUCKET/your_file/tmp/your_file

o

hadoop distcp s3: // YOUR_BUCKET/hdfs your_file: // master: 8020/your_file

Tal vez desde este punto se puede canalizar un zcat ...

Para añadir sus credenciales tiene que editar el archivo de núcleo-site.xml por:

<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

También es posible usar s3cat, parte de Tim conjunto de herramientas de línea de comandos de Kay como AWS:

http://timkay.com/aws/

para obtener el equivalente de zcat FILENAME | grep "log_id", que haría:

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

6

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

Para utilizar GET, debe tener acceso de lectura al objeto. Si otorga acceso de LECTURA al usuario anónimo, puede devolver el objeto sin usar un encabezado de autorización.

Si ese es el caso, puede utilizar:

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

o

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

Sin embargo, si no se ha concedido el acceso LEER anónimo en el objeto, es necesario crear y envíe el encabezado de autorización como parte de la solicitud GET y eso se vuelve algo tedioso de hacer con curl/wget. Por suerte para ti, alguien ya lo ha hecho y esa es la Perl aws script by Tim Kay como recommended by Hari. Tenga en cuenta que no tiene que colocar la secuencia de comandos de Tim Kay en su ruta o instalarla de otro modo (excepto que sea ejecutable), siempre que use las versiones de comandos que comienzan con aws, por ej.

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

Si su sistema operativo soporta (probable) se puede utilizar /dev/fd/1 para el objetivo para aws s3 cp:

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

Parece que hay algunos bytes de seguimiento después de EOF, pero zcat y bzcat a tan sólo escribir una advertencia al STDERR.

Me acaba de confirmar que esto funciona mediante la carga de alguna base de datos volcados directamente desde S3 así:

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

Todo esto con nada más que las cosas que ya están en el equipo y las herramientas oficiales AWS CLI. Ganar.

0

Tienes que intentar usar s3streamcat, es compatible con los archivos comprimidos bzip, gzip y xz.

instalar con

sudo pip install s3streamcat Uso

Uso:

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

encontrado este hilo hoy, y le gusta la respuesta de Keith. Avance rápido al aws cli de hoy se hace con:

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

Podría ahorrarle a alguien más un poco de tiempo.