Suche im S3-Bucket mit Protokollen

Suche im S3-Bucket mit Protokollen

Wie sucht man nach einer Zeichenfolge in vielen .gz-Dateien im Amazon S3-Bucket-Unterordner? Ich habe versucht, es über s3fs und zgrep zu mounten, aber es ist sooooo langsam. Verwenden Sie andere Methoden?

Gibt es vielleicht einen Amazon-Dienst, mit dem ich sie schnell zgreppen könnte?

Antwort1

Ich finde, der schnellste Weg besteht darin, sie zuerst lokal zu kopieren und dann ein lokales Zgrep auszuführen:

aws s3 cp s3://bucket/containing/the/logs . --recursive

cpDadurch werden alle Protokolle in Ihr aktuelles Verzeichnis ( ) kopiert ( ) .und alle Unterordner ebenfalls eingeschlossen ( --recursive).

Dann ein Einheimischer zgrep:

zgrep "search words" *.gz

Oder um auch Unterverzeichnisse rekursiv zu durchsuchen:

find -name \*.gz -print0 | xargs -0 zgrep "STRING"

(Genommen vonunix.stackexchange.com.)

Antwort2

Das ist nicht der Fall grep, aber Sie können jetzt Protokolle abfragen mitAthene:

Erste,Erstellen Sie eine Tabelle aus Ihrem S3-Bucket:

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/'

Anschließend können Sie es mit SQL abfragen:

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;

Antwort3

Ich hatte das gleiche Problem. Ich habe versucht, ein Python-Skript zu schreiben, um die Datei herunterzuladen und es durch zgrep auszuführen. Aber es dauerte 30 Sekunden, nur um einen Grep-Befehl auszuführen. Die Dateien waren außerdem etwa 200 MB groß, also war die Gesamtzeit sehr hoch. Und ich musste es für Hunderte von Dateien tun.

In meinem Fall habe ich eine Lambda-Funktion geschrieben und sie parallel für verschiedene .gz-Dateien ausgeführt. Verwenden Sie den /tmp-Speicher, um die .gz-Datei für eine Lambda-Instanz herunterzuladen und zgrep auszuführen.

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)

Mehrere Instanzen von Lambda können es zumindest um ein Vielfaches schneller machen. Bedenken Sie jedoch, dass der temporäre Speicher für Lambda nur 500 MB Speicherplatz hat.

Antwort4

Jetzt im Jahr 2023:

  • Verwenden Sie entweder „Mountpoint for Amazon S3“ und dann grep; ODER

  • Verwenden Sie cloudgrep mit:

    cloudgrep --bucket Ihr_Bucket --query Ihre_Abfrage

verwandte Informationen