Como procurar uma string dentro de vários arquivos .gz na subpasta do bucket do Amazon S3? Tentei montá-lo via s3fs e zgrep mas é muuuito lento. Você usa algum outro método?
Talvez exista algum serviço da Amazon que eu possa usar para fazer o zgrep rapidamente?
Responder1
Acho que a maneira mais rápida é copiá-los localmente primeiro e depois fazer um zgrep local:
aws s3 cp s3://bucket/containing/the/logs . --recursive
Isso copiará ( cp
) todos os logs para o diretório atual ( .
) e incluirá também todas as subpastas ( --recursive
).
Então um local zgrep
:
zgrep "search words" *.gz
Ou também para pesquisar subdiretórios recursivamente:
find -name \*.gz -print0 | xargs -0 zgrep "STRING"
(Tirado deunix.stackexchange.com.)
Responder2
Não é grep
, mas agora você pode consultar logs comAtenas:
Primeiro,crie uma tabela do seu bucket 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/'
Então, você pode consultá-lo com 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;
Responder3
Eu tive o mesmo problema. Tentei escrever um script python para baixar o arquivo e executá-lo através do zgrep. Mas demorou 30 segundos apenas para executar um comando grep. Os arquivos também tinham cerca de 200 MB, então o tempo geral foi muito alto. E tive que fazer isso para centenas de arquivos.
No meu caso, escrevi uma função lambda e executei-a paralelamente para diferentes arquivos .gz. Use o armazenamento /tmp para baixar o arquivo .gz para uma instância lambda e execute 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)
Várias instâncias de lambda podem torná-lo pelo menos algumas vezes mais rápido. Embora lembre-se de que o armazenamento tmp para lambda possui apenas 500 MB de armazenamento.
Responder4
Agora em 2023:
Use "Mountpoint for Amazon S3" e depois grep; OU
Use cloudgrep com:
cloudgrep --bucket seu_bucket --query sua_consulta