¿Cómo buscar una cadena dentro de muchos archivos .gz en la subcarpeta del depósito de Amazon S3? Intenté montarlo mediante s3fs y zgrep pero es muy lento. ¿Usas algún otro método?
¿Quizás existe algún servicio de Amazon que pueda utilizar para realizar un zgrep rápidamente?
Respuesta1
Creo que la forma más rápida es copiarlos localmente primero y luego hacer un zgrep local:
aws s3 cp s3://bucket/containing/the/logs . --recursive
Esto copiará ( cp
) todos los registros a su directorio actual ( .
) y también incluirá todas las subcarpetas ( --recursive
).
Entonces un local zgrep
:
zgrep "search words" *.gz
O también para buscar subdirectorios de forma recursiva:
find -name \*.gz -print0 | xargs -0 zgrep "STRING"
(Tomado deunix.stackexchange.com.)
Respuesta2
No lo es grep
, pero ahora puedes consultar registros conAtenea:
Primero,cree una tabla desde su depósito S3:
CREATE EXTERNAL TABLE IF NOT EXISTS S3Accesslogs(
BucketOwner string,
Bucket string,
RequestDateTime string,
RemoteIP string,
Requester string,
RequestID string,
Operation string,
Key string,
RequestURI_operation string,
RequestURI_key string,
RequestURI_httpProtoversion string,
HTTPstatus string,
ErrorCode string,
BytesSent string,
ObjectSize string,
TotalTime string,
TurnAroundTime string,
Referrer string,
UserAgent string,
VersionId string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1',
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \\\"([^ ]*) ([^ ]*) (- |[^ ]*)\\\" (-|[0-9]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*)$'
)
LOCATION 's3://s3-server-access/logs/'
Luego, puedes consultarlo con SQL:
SELECT requestdatetime, bucket, remoteip, requesturi_key
FROM s3accesslogs
WHERE bucket IN ('bucket1', 'bucket2')
AND remoteip = '123.45.67.89'
ORDER BY requestdatetime DESC
LIMIT 100;
Respuesta3
Yo tuve el mismo problema. Intenté escribir un script en Python para descargar el archivo y ejecutarlo a través de zgrep. Pero tomó 30 segundos ejecutar un comando grep. Los archivos también pesaban alrededor de 200 MB, por lo que el tiempo total fue muy alto. Y tuve que hacerlo con cientos de archivos.
En mi caso, escribí una función lambda y la ejecuté en paralelo para diferentes archivos .gz. Utilice el almacenamiento /tmp para descargar el archivo .gz para una instancia lambda y ejecute zgrep.
os.chdir('/tmp/') os.mkdir('s3_logs') os.chdir('s3_logs') s3.download_file(Bucket, s3object, '/tmp/s3_logs/file.gz') query = 'zgrep String file.gz' result = os.popen(query).read() print(result)
Varias instancias de lambda pueden hacerlo al menos algunas veces más rápido. Aunque recuerde que el almacenamiento tmp para lambda tiene solo 500 MB de almacenamiento.
Respuesta4
Ahora en 2023:
Utilice "Mountpoint para Amazon S3" y luego grep; O
Utilice cloudgrep con:
cloudgrep --bucket tu_bucket --query tu_consulta