Поиск внутри контейнера s3 с журналами

Поиск внутри контейнера s3 с журналами

Как искать строку внутри множества файлов .gz в подпапке Amazon S3 bucket? Я пробовал монтировать его через s3fs и zgrep, но это ооочень медленно. Вы используете какие-нибудь другие методы?

Может быть, есть какой-нибудь сервис Amazon, который я мог бы использовать для быстрого 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"

(Взято изunix.stackexchange.com.)

решение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. Но потребовалось 30 секунд только для запуска одной команды grep. Файлы также были около 200 МБ, так что общее время было очень высоким. И мне пришлось сделать это для сотен файлов.

В моем случае я написал лямбда-функцию и запустил ее параллельно для разных .gz-файлов. Используйте хранилище /tmp для загрузки .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)

Несколько экземпляров лямбды могут сделать его по крайней мере в несколько раз быстрее. Хотя помните, что хранилище tmp для лямбды имеет только 500 МБ памяти.

решение4

Сейчас в 2023 году:

  • Либо используйте «Mountpoint for Amazon S3», а затем grep; ИЛИ

  • Используйте cloudgrep с:

    cloudgrep --bucket ваш_ведро --query ваш_запрос

Связанный контент