Grok SerDe
Il SerDe Logstash Grok è una libreria con un set di modelli specializzati per la deserializzazione di dati di testo non strutturati, di solito log. Ogni modello Grok è un'espressione regolare con nome. Puoi identificare e riutilizzare questi modelli di deserializzazione in base alle esigenze. Ciò rende più semplice utilizzare Grok anziché le espressioni regolari. Grok fornisce una serie di modelli predefiniti
Nome della libreria di serializzazione
Il nome della libreria di serializzazione per Grok SerDe è com.amazonaws.glue.serde.GrokSerDe.
Come usare Grok SerDe
Per specificare il SerDe Grok durante la creazione di una tabella in ROW FORMAT
SERDE 'com.amazonaws.glue.serde.GrokSerDe', utilizza la clausola Athena seguita dalla clausola WITH
SERDEPROPERTIES che specifica i modelli che devono corrispondere ai dati, dove:
-
L' espressione
input.formatdefinisce i modelli che devono corrispondere ai dati. Questo dato è obbligatorio. -
L' espressione
input.grokCustomPatternsdefinisce un modello personalizzato con nome, che potrà essere utilizzato successivamente all'interno dell'espressioneinput.format. Si tratta di un'opzione facoltativa. Per includere più voci di modello nell'espressioneinput.grokCustomPatterns, utilizza la carattere escape nuova riga (\n) per separarle, come segue:'input.grokCustomPatterns'='INSIDE_QS ([^\"]*).\nINSIDE_BRACKETS ([^\\]]*)') -
Le clausole
STORED AS INPUTFORMATeOUTPUTFORMATsono obbligatorie. -
La clausola
LOCATIONspecifica un bucket Amazon S3 che può contenere più oggetti dati. Tutti gli oggetti dati presenti nel bucket vengono deserializzati per creare la tabella.
Esempi
Gli esempi in questa sezione si basano sull'elenco di modelli Grok predefiniti. Per ulteriori informazioni, consultare grok-patterns
Esempio 1
Questo esempio utilizza l'origine dati dalle voci del log mail Postfix salvate in 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>
La seguente istruzione crea una tabella in Athena denominata mygroktable dall'origine dati, utilizzando un modello personalizzato e i modelli predefiniti da te specificati:
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/';
Iniziare dapprima con un modello come %{NOTSPACE:column}, per ottenere le colonne mappate e in seguito specializzare le colonne se necessario.
Esempio 2
In questo esempio, è necessario creare una query per i log di Log4j. Le voci dei log di esempio sono in questo formato:
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
Per eseguire la query sui dati di questo log:
-
Aggiungi il modello Grok per
input.formatper ogni colonna. Ad esempio, pertimestamp, aggiungi%{TIMESTAMP_ISO8601:timestamp}. Perloglevel, aggiungi%{LOGLEVEL:loglevel}. -
Assicurati che il modello in
input.formatcorrisponda esattamente al formato del log mappando i trattini (-) e le virgole che separano le voci nel formato di log.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/';
Esempio 3
L'esempio seguente dell’istruzione CREATE TABLE per i log di accesso al server di Amazon S3 mostra l'espressione 'input.grokCustomPatterns' che contiene due voci di modello separate dal carattere escape nuova riga (\n), come illustrato in questo frammento della query di esempio: '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'
Consulta anche
-
Understanding Grok Patterns
(sito web esterno) -
Schemi integrati (Guida per l'utente AWS Glue)