Grok SerDe
Logstash Grok SerDe は、構造化されていないテキストデータ (通常はログ) の逆シリアル化専用のパターンセットで構成されるライブラリです。各 Grok パターンは名前付きの正規表現です。必要に応じて、これらの逆シリアル化パターンを特定し、再利用できます。このため、正規表現を使用するよりも Grok を使用するほうが簡単です。Grok は、定義済みパターン
シリアル化ライブラリ名
Grok SerDe のシリアル化ライブラリ名は com.amazonaws.glue.serde.GrokSerDe
です。
Grok SerDe の使用方法
Athena でテーブルを作成するときに Grok SerDe を指定するには、ROW FORMAT
SERDE 'com.amazonaws.glue.serde.GrokSerDe'
句を使用し、この句の後に、データで一致させるパターンを指定する WITH
SERDEPROPERTIES
句を使用します。詳細を以下に示します。
-
input.format
式は、データでマッチさせるパターンを定義します。これは必須です。 -
input.grokCustomPatterns
式は、カスタムの名前付きパターンを定義します。後で、このパターンをinput.format
式内で使用できます。これはオプションです。複数のパターンエントリをinput.grokCustomPatterns
式に含めるには、改行のエスケープ文字 (\n
) を使用して、次のように区切ります。'input.grokCustomPatterns'='INSIDE_QS ([^\"]*)
。\n
INSIDE_BRACKETS ([^\\]]*)') -
STORED AS INPUTFORMAT
句とOUTPUTFORMAT
句は必須です。 -
LOCATION
句は、Amazon S3 バケットを指定します。このバケットには、複数のデータオブジェクトを含めることができます。バケット内のすべてのデータオブジェクトが逆シリアル化されてテーブルが作成されます。
例
このセクションの例は、Grok の定義済みパターンのリストに依存します。「定義済みパターン
例 1
この例では、s3://amzn-s3-demo-bucket/groksample/
に保存された Postfix のメールログのエントリからソースデータを使用します。
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>
以下のステートメントは、ユーザー指定のカスタムパターンと事前定義されたパターンを使用して、ソースデータから mygroktable
という名前のテーブルを Athena で作成します。
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
/';
%{NOTSPACE:column}
などのシンプルなパターンから始め、最初に列をマッピングし、次に必要に応じて列を特化します。
例 2
次の例では、Log4j ログのクエリを作成します。ログの例には、次の形式のエントリが含まれています。
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
このログデータをクエリするには:
-
Grok パターンを各列の
input.format
に追加します。たとえば、timestamp
に%{TIMESTAMP_ISO8601:timestamp}
を追加します。loglevel
に%{LOGLEVEL:loglevel}
を追加します。 -
ログ形式のエントリを区切るダッシュ (
-
) とカンマをマッピングすることで、input.format
のパターンがログの形式と正確に一致することを確認します。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
/';
例 3
クエリ例のスニペット 'input.grokCustomPatterns'='INSIDE_QS
([^\"]*)
に示すように、次の Amazon S3 サーバー アクセス ログ \n
INSIDE_BRACKETS
([^\\]]*)')CREATE TABLE
ステートメントの例には、改行エスケープ文字 (\n
) で区切られた 2 つのパターンエントリが含まれる 'input.grokCustomPatterns'
式が含まれています。
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'