Grok SerDe - Amazon Athena

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, tuttavia è possibile anche creare dei modelli personalizzati.

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.format definisce i modelli che devono corrispondere ai dati. Questo dato è obbligatorio.

  • L' espressione input.grokCustomPatterns definisce un modello personalizzato con nome, che potrà essere utilizzato successivamente all'interno dell'espressione input.format. Si tratta di un'opzione facoltativa. Per includere più voci di modello nell'espressione input.grokCustomPatterns, utilizza la carattere escape nuova riga (\n) per separarle, come segue: 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)').

  • Le clausole STORED AS INPUTFORMAT e OUTPUTFORMAT sono obbligatorie.

  • La clausola LOCATION specifica 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 su GitHub.com.

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.format per ogni colonna. Ad esempio, per timestamp, aggiungi %{TIMESTAMP_ISO8601:timestamp}. Per loglevel, aggiungi %{LOGLEVEL:loglevel}.

  • Assicurati che il modello in input.format corrisponda 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