

# Grok SerDe
<a name="grok-serde"></a>

Logstash Grok SerDe는 비정형 텍스트 데이터(일반적으로 로그)의 역직렬화를 위한 특수 패턴 집합이 있는 라이브러리입니다. 각 Grok 패턴은 명명된 정규식입니다. 필요에 따라 이러한 역직렬화 패턴을 식별하고 재사용할 수 있습니다. 그러면 정규식을 사용하는 경우에 비해 더 쉽게 Grok을 사용할 수 있습니다. Grok은 [사전 정의된 패턴](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns) 집합을 제공합니다. 사용자 지정 패턴을 만들 수도 있습니다.

## 직렬화 라이브러리 이름
<a name="library-name"></a>

Grok SerDe의 직렬화 라이브러리 이름은 `com.amazonaws.glue.serde.GrokSerDe`입니다.

## Grok SerDe 사용 방법
<a name="grok-serde-using"></a>

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 버킷을 지정합니다. 버킷의 모든 데이터 객체가 역직렬화되어 테이블을 생성합니다.

## 예시
<a name="examples"></a>

이 섹션의 예제는 사전 정의된 Grok 패턴의 목록에 의존합니다. 자세한 내용은 GitHub.com의 [grok-patterns](https://github.com/elastic/logstash/blob/v1.4.2/patterns/grok-patterns)를 참조하세요.

### 예 1
<a name="example-1"></a>

이 예제는 `s3://amzn-s3-demo-bucket/groksample/`에 저장된 Postfix maillog 항목의 소스 데이터를 사용합니다.

```
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>
```

다음 명령문은 Athena에서 사용자 지정 패턴과 직접 지정한 사전 정의된 패턴을 사용하여 소스 데이터로 `mygroktable`이라는 테이블을 작성합니다.

```
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
<a name="example-2"></a>

다음 예에서는 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
```

이 로그 데이터를 쿼리하려면:
+ 각 열의 `input.format`에 Grok 패턴을 추가합니다. 예를 들어 `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
<a name="example-3"></a>

다음 예제 [Amazon S3 서버 액세스 로그](https://docs.aws.amazon.com/AmazonS3/latest/userguide/LogFormat.html) `CREATE TABLE` 문은 예제 쿼리의 코드 조각 `'input.grokCustomPatterns'='INSIDE_QS ([^\"]*){{\n}}INSIDE_BRACKETS ([^\\]]*)')`에서처럼 줄 바꿈 이스케이프 문자(`\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'
```

## 다음 사항도 참조하세요.
<a name="grok-serde-see-also"></a>
+ [Grok 패턴 이해](https://edgedelta.com/company/blog/what-are-grok-patterns)(외부 웹 사이트)
+ [기본 제공 패턴](https://docs.aws.amazon.com/glue/latest/dg/custom-classifier.html#classifier-builtin-patterns)(*AWS Glue 사용 설명서*)