Grok SerDe - Amazon Athena

Grok SerDe

O Logstash Grok SerDe é uma biblioteca com um conjunto de padrões especializados para desserialização de arquivos de texto desestruturados, normalmente logs. Cada padrão Grok é uma expressão regular nomeada. Você pode identificar e reutilizar esses padrões de desserialização conforme necessário. Isso facilita o uso de Grok, em comparação com o uso de expressões regulares. O Grok oferece um conjunto de padrões predefinidos. Você também pode criar padrões personalizados.

Nome da biblioteca de serialização

O nome da biblioteca de serialização do Grok SerDe é com.amazonaws.glue.serde.GrokSerDe.

Como usar o Grok SerDe

Para especificar o Grok SerDe ao criar uma tabela no Athena, use a cláusula ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe', seguida da cláusula WITH SERDEPROPERTIES que especifica os padrões de correspondência em seus dados, em que:

  • A expressão input.format define os padrões para que correspondam aos dados. Isso é obrigatório.

  • A expressão input.grokCustomPatterns define um padrão personalizado nomeado, que você poderá usar depois dentro da expressão input.format. Isso é opcional. Para incluir várias entradas padrão na expressão input.grokCustomPatterns, use o caractere de escape de nova linha (\n) para separá-las, da seguinte forma: 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)').

  • As cláusulas STORED AS INPUTFORMAT e OUTPUTFORMAT são obrigatórias.

  • A cláusula LOCATION especifica um bucket do Amazon S3, que pode conter vários objetos de dados. Todos os objetos de dados no bucket são desserializados para criar a tabela.

Exemplos

Os exemplos nesta seção dependem da lista de padrões Grok predefinidos. Para obter mais informações, consulte grok-patterns em GitHub.com.

Exemplo 1

Este exemplo usa os dados de origem das entradas de maillog do Postfix salvas em 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>

A instrução a seguir cria uma tabela no Athena chamada mygroktable com base nos dados de origem usando um padrão personalizado e os padrões predefinidos que você especificar:

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

Comece com um padrão simples, como %{NOTSPACE:column}, para primeiro obter as colunas mapeadas e, em seguida, especialize as colunas, se necessário.

Exemplo 2

No exemplo a seguir, você cria uma consulta para logs Log4j. Os logs de exemplo têm as entradas neste 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

Para consultar os dados desse log:

  • Adicione o padrão Grok ao input.format para cada coluna. Por exemplo, para timestamp, adicione %{TIMESTAMP_ISO8601:timestamp}. Para loglevel, adicione %{LOGLEVEL:loglevel}.

  • Verifique se o padrão em input.format está de acordo com o formato exato do log mapeando os traços (-) e as vírgulas que separam as entradas no formato do 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/';

Exemplo 3

O exemplo de instrução CREATE TABLE de Logs de acesso ao servidor do Amazon S3 a seguir mostra a expressão 'input.grokCustomPatterns' que contém duas entradas de padrão, separadas pelo caractere de escape de nova linha (\n), conforme mostrado neste trecho do exemplo de consulta: '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'

Consulte também