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
Nombre de la biblioteca de serialización
El nombre de la biblioteca de serialización de Grok SerDe es com.amazonaws.glue.serde.GrokSerDe
.
Cómo utilizar SerDe Grok
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. Esto es necesario. -
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
Los ejemplos en esta sección se basan en la lista de patrones de Grok predefinidos. Para obtener más información, consulte grok-patterns
Ejemplo 1
En este ejemplo se utilizan datos de origen de entradas de registro de correo Postfix guardadas en 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 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://amzn-s3-demo-bucket/
groksample
/';
Comience con un patrón, como %{NOTSPACE:column}
, para asignar primero las columnas y después especialícelas 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 registros haga lo siguiente:
-
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://amzn-s3-demo-bucket/
samples
/';
Ejemplo 3
En la siguiente declaración CREATE TABLE
de los registros de acceso al servidor de Amazon S3 muestra la expresión 'input.grokCustomPatterns'
que contiene dos entradas de patrón, separadas por el carácter de escape de nueva línea (\n
), como se muestra en este fragmento 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://amzn-s3-demo-bucket'
Véase también
-
Comprensión de los patrones Grok
(sitio web externo) -
Patrones integrados (Guía del usuario de AWS Glue)