El SerDe de Grok - Amazon Athena

El SerDe de Grok

El SerDe de Grok Logstash es una biblioteca con un conjunto de patrones especializados para la deserialización de archivos de texto sin estructurar, normalmente registros. Cada patrón de Grok es una expresión regular con nombre. Puede identificar y volver a utilizar estos patrones de deserialización según sea necesario. De ese modo resulta más sencillo utilizar Grok en comparación con el uso de expresiones regulares. Grok proporciona un conjunto de patrones predefinidos. También puede crear patrones personalizados.

Para especificar el SerDe de Grok al crear una tabla en Athena, utilice la cláusula ROW FORMAT SERDE 'com.amazonaws.glue.serde.GrokSerDe' seguida de la cláusula WITH SERDEPROPERTIES que especifica los patrones que concuerdan con los datos, donde:

  • La expresión input.format define los patrones que concuerdan con los datos. Es obligatorio.

  • La expresión input.grokCustomPatterns define un patrón personalizado con nombre, que posteriormente puede utilizar dentro de la expresión input.format. Es opcional. Para incluir varias entradas de patrones en la expresión input.grokCustomPatterns, sepárelas con el carácter de escape para nueva línea (\n), de esta forma: 'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)\nINSIDE_BRACKETS ([^\\]]*)').

  • Las cláusulas STORED AS INPUTFORMAT y OUTPUTFORMAT son obligatorias.

  • La cláusula LOCATION especifica un bucket de Amazon S3 que puede contener varios objetos de datos. Todos los objetos de datos del bucket se deserializan para crear la tabla.

Ejemplos

Estos ejemplos se basan en la lista de patrones de Grok predefinidos. Consulte los patrones predefinidos.

Ejemplo 1

En este ejemplo se utilizan datos de origen de entradas de registro de correo Postfix guardadas en 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 siguiente instrucción crea una tabla en Athena llamada mygroktable a partir de los datos de origen, usando un patrón personalizado y los patrones predefinidos que especifique:

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

Comience con un patrón sencillo, como %{NOTSPACE:column}, para asignar primero las columnas y después especialice las columnas si es necesario.

Ejemplo 2

En el siguiente ejemplo se crea una consulta para registros Log4j. Los registros de ejemplo tienen las entradas en este 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 estos datos de registro:

  • Añada el patrón de Grok al input.format de cada columna. Por ejemplo, para timestamp, añada %{TIMESTAMP_ISO8601:timestamp}. Para loglevel, añada %{LOGLEVEL:loglevel}.

  • Asegúrese de que el patrón de input.format coincida exactamente con el formato del log mapeando los guiones (-) y las comas que separan las entregas en el formato de 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/';

Ejemplo 3

El ejemplo siguiente de consulta de registros de Amazon S3 muestra la expresión 'input.grokCustomPatterns' con dos entradas de patrón separadas por el carácter de escape de nueva línea (\n), como indica este fragmento de código de la consulta de ejemplo: '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'