- Grok SerDe - Amazon Athena

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

- Grok SerDe

Logstash Grok SerDe è una libreria con una serie di modelli specializzati per la deserializzazione di dati di testo non strutturati, solitamente 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.

Per specificare Grok SerDe durante la creazione di una tabella in Athena, usa ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' la clausola, seguita dalla clausola che specifica WITH SERDEPROPERTIES i modelli da abbinare nei tuoi dati, dove:

  • L' espressione input.format definisce i modelli che devono corrispondere ai dati. È obbligatorio.

  • L' espressione input.grokCustomPatterns definisce un modello personalizzato con nome, che potrà essere utilizzato successivamente all'interno dell'espressione input.format. È facoltativo. 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

Questi esempi si basano sull'elenco di modelli Grok predefiniti. A tal proposito, consulta la sezione relativa ai i modelli predefiniti.

Esempio 1

Questo esempio utilizza l'origine dati dalle voci del log mail Postfix salvate in s3://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/groksample/';

Inizia dapprima con un modello semplice, ad esempio %{NOTSPACE:column}, per ottenere le colonne mappate; in seguito potrai 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://DOC-EXAMPLE-BUCKET/samples/';

Esempio 3

L'esempio seguente di query dei log 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://DOC-EXAMPLE-BUCKET'