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
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óninput.format
. Es opcional. Para incluir varias entradas de patrones en la expresióninput.grokCustomPatterns
, sepárelas con el carácter de escape para nueva línea (\n
), de esta forma:'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)
.\n
INSIDE_BRACKETS ([^\\]]*)') -
Las cláusulas
STORED AS INPUTFORMAT
yOUTPUTFORMAT
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, paratimestamp
, añada%{TIMESTAMP_ISO8601:timestamp}
. Paraloglevel
, 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
([^\"]*)
.\n
INSIDE_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'