如何在 Amazon S3 存储桶子文件夹中的大量 .gz 文件中搜索字符串?我尝试通过 s3fs 和 zgrep 安装它,但速度太慢了。你还使用其他方法吗?
也许我可以使用任何亚马逊服务来快速 zgrep 它们?
答案1
我发现最快的方法是先在本地复制它们,然后执行本地 zgrep:
aws s3 cp s3://bucket/containing/the/logs . --recursive
这会将 ( cp
) 所有日志复制到当前目录 ( .
) 并包含所有子文件夹 ( --recursive
)。
然后是本地的zgrep
:
zgrep "search words" *.gz
或者也递归搜索子目录:
find -name \*.gz -print0 | xargs -0 zgrep "STRING"
答案2
不是grep
,但您现在可以使用以下命令查询日志雅典娜:
第一的,从您的 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/'
然后就可以用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;
答案3
我有同样的问题。我尝试编写一个 python 脚本来下载该文件并通过 zgrep 运行它。但仅运行一个 grep 命令就需要 30 秒。文件也约为 200MB,因此总体时间非常长。我必须对数百个文件执行此操作。
就我而言,我编写了一个 lambda 函数并针对不同的 .gz 文件并行运行它。使用 /tmp 存储下载 lambda 实例的 .gz 文件并运行 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)
lambda 的多个实例可以使其速度至少提高几倍。尽管请记住,lambda 的 tmp 存储空间只有 500MB。
答案4
现在到 2023 年:
要么使用“Mountpoint for Amazon S3”,然后使用 grep;或者
使用 cloudgrep 进行以下操作:
cloudgrep --bucket your_bucket --query your_query