Grok SerDe
Beim Logstash Grok SerDe handelt es sich um eine Bibliothek mit einer Reihe spezifischer Muster für die Deserialisierung unstrukturierter Textdaten (in der Regel Protokolle). Jedes Grok-Muster ist ein benannter regulärer Ausdruck. Sie können diese Deserialisierungsmuster identifizieren und bei Bedarf wiederverwenden. Dies macht die Verwendung von Grok einfacher als die Verwendung regulärer Ausdrücke. Grok bietet eine Reihe vordefinierter Muster
Name der Serialisierungsbibliothek
Der Name der Serialisierungsbibliothek für den Grok SerDe lautet com.amazonaws.glue.serde.GrokSerDe.
Wie verwendet man Grok SerDe
Um beim Erstellen einer Tabelle in Athena den Grok SerDe anzugeben, verwenden Sie die Klausel ROW FORMAT
SERDE 'com.amazonaws.glue.serde.GrokSerDe', gefolgt von der Klausel WITH
SERDEPROPERTIES, die die Muster angibt, mit denen eine Übereinstimmung in Ihren Daten erzielt werden soll. Dabei gilt:
-
Der
input.format-Ausdruck definiert die Muster, mit denen in den Daten eine Übereinstimmung erzielt werden soll. Diese Information ist erforderlich. -
Der
input.grokCustomPatterns-Ausdruck definiert ein benanntes benutzerdefiniertes Muster, das Sie anschließend innerhalb desinput.format-Ausdrucks verwenden können. Dieser Schritt ist optional. Um mehrere Mustereinträge iminput.grokCustomPatterns-Ausdruck einzuschließen, verwenden Sie das Zeilenumbruchszeichen (\n), um diese zu trennen, wie im Folgenden dargestellt:'input.grokCustomPatterns'='INSIDE_QS ([^\"]*).\nINSIDE_BRACKETS ([^\\]]*)') -
Die Klauseln
STORED AS INPUTFORMATundOUTPUTFORMATsind erforderlich. -
Die Klausel
LOCATIONgibt einen Amazon-S3-Bucket an, der mehrere Datenobjekte enthalten kann. Alle Datenobjekte im Bucket werden deserialisiert, um die Tabelle zu erstellen.
Beispiele
Diese Beispiele in diesem Abschnitt basieren auf der Liste vordefinierter Grok-Muster. Weitere Informationen finden Sie unter Grok-Muster
Beispiel 1
Dieses Beispiel verwendet Quelldaten von in gespeicherten Postfix-E-Mail-Protokolleinträgen s3://amzn-s3-demo-bucket/groksample/.
Feb 9 07:15:00 m4eastmail postfix/smtpd[19305]: B88C4120838: connect from unknown[192.168.55.4]
Feb 9 07:15:00 m4eastmail postfix/smtpd[20444]: B58C4330038: client=unknown[192.168.55.4]
Feb 9 07:15:03 m4eastmail postfix/cleanup[22835]: BDC22A77854: message-id=<31221401257553.5004389LCBF@m4eastmail.example.com>
Die folgende Anweisung erstellt eine Tabelle namens mygroktable in Athena aus den Quelldaten. Dies erfolgt unter Verwendung eines benutzerdefinierten Musters und der von Ihnen angegebenen vordefinierten Muster.
CREATE EXTERNAL TABLE `mygroktable`( syslogbase string, queue_id string, syslog_message string ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( 'input.grokCustomPatterns' = 'POSTFIX_QUEUEID [0-9A-F]{7,12}', 'input.format'='%{SYSLOGBASE} %{POSTFIX_QUEUEID:queue_id}: %{GREEDYDATA:syslog_message}' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/groksample/';
Beginnen Sie mit einem Muster wie %{NOTSPACE:column}, um zuerst die Spalten zuzuordnen, und spezialisieren Sie diese dann bei Bedarf.
Beispiel 2
Im folgenden Beispiel erstellen Sie eine Abfrage für Log4j-Protokolle. Die Einträge der Beispielprotokolle weisen folgendes Format auf:
2017-09-12 12:10:34,972 INFO - processType=AZ, processId=ABCDEFG614B6F5E49, status=RUN,
threadId=123:amqListenerContainerPool23P:AJ|ABCDE9614B6F5E49||2017-09-12T12:10:11.172-0700],
executionTime=7290, tenantId=12456, userId=123123f8535f8d76015374e7a1d87c3c, shard=testapp1,
jobId=12312345e5e7df0015e777fb2e03f3c, messageType=REAL_TIME_SYNC,
action=receive, hostname=1.abc.def.com
Um diese Protokolldaten abzufragen:
-
Fügen Sie das Grok-Muster für jede Spalte zum
input.formathinzu. Fügen Sie beispielsweise fürtimestamp%{TIMESTAMP_ISO8601:timestamp}hinzu. Fügen Sie fürloglevel%{LOGLEVEL:loglevel}hinzu. -
Stellen Sie sicher, dass das Muster in
input.formatexakt mit dem Format des Protokolls übereinstimmt, indem Sie die Bindestriche (-) und die Kommata zuweisen, die die Einträge im Protokollformat trennen.CREATE EXTERNAL TABLE bltest ( timestamp STRING, loglevel STRING, processtype STRING, processid STRING, status STRING, threadid STRING, executiontime INT, tenantid INT, userid STRING, shard STRING, jobid STRING, messagetype STRING, action STRING, hostname STRING ) ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' WITH SERDEPROPERTIES ( "input.grokCustomPatterns" = 'C_ACTION receive|send', "input.format" = "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:loglevel} - processType=%{NOTSPACE:processtype}, processId=%{NOTSPACE:processid}, status=%{NOTSPACE:status}, threadId=%{NOTSPACE:threadid}, executionTime=%{POSINT:executiontime}, tenantId=%{POSINT:tenantid}, userId=%{NOTSPACE:userid}, shard=%{NOTSPACE:shard}, jobId=%{NOTSPACE:jobid}, messageType=%{NOTSPACE:messagetype}, action=%{C_ACTION:action}, hostname=%{HOST:hostname}" ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/samples/';
Beispiel 3
Das folgende Beispiel für die CREATE TABLE-Anweisung von Amazon-S3-Zugriffsprotokollen zeigt den 'input.grokCustomPatterns'-Ausdruck, der zwei Mustereinträge enthält, die durch das Zeilenumbruchszeichen (\n) getrennt werden. Dies ist im folgenden Ausschnitt der Beispielabfrage dargestellt: 'input.grokCustomPatterns'='INSIDE_QS
([^\"]*).\nINSIDE_BRACKETS
([^\\]]*)')
CREATE EXTERNAL TABLE `s3_access_auto_raw_02`(
`bucket_owner` string COMMENT 'from deserializer',
`bucket` string COMMENT 'from deserializer',
`time` string COMMENT 'from deserializer',
`remote_ip` string COMMENT 'from deserializer',
`requester` string COMMENT 'from deserializer',
`request_id` string COMMENT 'from deserializer',
`operation` string COMMENT 'from deserializer',
`key` string COMMENT 'from deserializer',
`request_uri` string COMMENT 'from deserializer',
`http_status` string COMMENT 'from deserializer',
`error_code` string COMMENT 'from deserializer',
`bytes_sent` string COMMENT 'from deserializer',
`object_size` string COMMENT 'from deserializer',
`total_time` string COMMENT 'from deserializer',
`turnaround_time` string COMMENT 'from deserializer',
`referrer` string COMMENT 'from deserializer',
`user_agent` string COMMENT 'from deserializer',
`version_id` string COMMENT 'from deserializer')
ROW FORMAT SERDE
'com.amazonaws.glue.serde.GrokSerDe'
WITH SERDEPROPERTIES (
'input.format'='%{NOTSPACE:bucket_owner} %{NOTSPACE:bucket} \\[%{INSIDE_BRACKETS:time}\\] %{NOTSPACE:remote_ip} %{NOTSPACE:requester} %{NOTSPACE:request_id} %{NOTSPACE:operation} %{NOTSPACE:key} \"?%{INSIDE_QS:request_uri}\"? %{NOTSPACE:http_status} %{NOTSPACE:error_code} %{NOTSPACE:bytes_sent} %{NOTSPACE:object_size} %{NOTSPACE:total_time} %{NOTSPACE:turnaround_time} \"?%{INSIDE_QS:referrer}\"? \"?%{INSIDE_QS:user_agent}\"? %{NOTSPACE:version_id}',
'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)')
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://amzn-s3-demo-bucket'
Weitere Informationen finden Sie auch unter
-
Grok-Muster verstehen
(externe Website) -
Integrierte Muster (AWS Glue-Benutzerhandbuch)