

# Amazon EMR 로그 쿼리
<a name="emr-logs"></a>

Amazon EMR 및 Amazon EMR에서 실행되는 빅 데이터 애플리케이션은 로그 파일을 생성합니다. 로그 파일은 [프라이머리 노드](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)에 작성되며 로그 파일을 Amazon S3에 자동으로 보관하도록 Amazon EMR을 구성할 수도 있습니다. Amazon Athena를 사용하여 이러한 로그를 쿼리해 애플리케이션 및 클러스터의 이벤트 및 추세를 식별할 수 있습니다. Amazon EMR의 로그 파일 형식 및 Amazon S3에 이를 저장하는 방법에 대한 자세한 내용은 *Amazon EMR 관리 안내서*의 [로그 파일 보기](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)를 참조하세요.

**Topics**
+ [Amazon EMR 로그 파일을 기반으로 기본 테이블 생성 및 쿼리](emr-create-table.md)
+ [Amazon EMR 로그를 기반으로 분할된 테이블 생성 및 쿼리](emr-create-table-partitioned.md)

# Amazon EMR 로그 파일을 기반으로 기본 테이블 생성 및 쿼리
<a name="emr-create-table"></a>

다음 예제에서는 `s3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/elasticmapreduce/`에 저장된 로그 파일을 기반으로 기본 테이블 `myemrlogs`를 생성합니다. 아래 예제에 사용된 Amazon S3 위치는 *us-west-2* 리전의 Amazon Web Services 계정 *123456789012*에서 생성한 EMR 클러스터의 기본 로그 위치 패턴을 반영합니다. 사용자 지정 위치를 사용하는 경우 패턴은 s3://amzn-s3-demo-bucket/*ClusterID*입니다.

잠재적으로 쿼리 성능을 향상시키고 데이터 전송을 줄이기 위해 분할된 테이블을 생성하는 방법에 대한 자세한 내용은 [Amazon EMR 로그를 기반으로 분할된 테이블 생성 및 쿼리](emr-create-table-partitioned.md) 단원을 참조하세요.

```
CREATE EXTERNAL TABLE `myemrlogs`(
  `data` string COMMENT 'from deserializer')
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

## 예제 쿼리
<a name="emr-example-queries-basic"></a>

다음 예제 쿼리는 이전 예제에서 생성된 `myemrlogs` 테이블에서 실행할 수 있습니다.

**Example - ERROR, WARN, INFO, EXCEPTION, FATAL 또는 DEBUG 발생에 대한 단계 로그 쿼리**  

```
SELECT data,
        "$PATH"
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'s-86URH188Z6B1')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example - ERROR, WARN, INFO, EXCEPTION, FATAL 또는 DEBUG에 대한 특정 인스턴스 로그 i-00b3c0a839ece0a9c 쿼리**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'i-00b3c0a839ece0a9c')
        AND regexp_like("$PATH",'state')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example - ERROR, WARN, INFO, EXCEPTION, FATAL 또는 DEBUG에 대한 Presto 애플리케이션 로그 쿼리**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'presto')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example - ERROR, WARN, INFO, EXCEPTION, FATAL 또는 DEBUG에 대한 Namenode 애플리케이션 로그 쿼리**  

```
SELECT "data",
        "$PATH" AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'namenode')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

**Example - ERROR, WARN, INFO, EXCEPTION, FATAL 또는 DEBUG에 대해 날짜 및 시간별 모든 로그 쿼리**  

```
SELECT distinct("$PATH") AS filepath
FROM "default"."myemrlogs"
WHERE regexp_like("$PATH",'2019-07-23-10')
        AND regexp_like(data, 'ERROR|WARN|INFO|EXCEPTION|FATAL|DEBUG') limit 100;
```

# Amazon EMR 로그를 기반으로 분할된 테이블 생성 및 쿼리
<a name="emr-create-table-partitioned"></a>

이러한 예제에서는 동일한 로그 위치를 사용하여 Athena 테이블을 생성하지만 테이블은 분할되고 각 로그 위치에 대해 파티션이 생성됩니다. 자세한 내용은 [데이터 파티셔닝](partitions.md) 단원을 참조하세요.

다음 쿼리는 `mypartitionedemrlogs`라는 분할된 테이블을 생성합니다.

```
CREATE EXTERNAL TABLE `mypartitionedemrlogs`(
  `data` string COMMENT 'from deserializer')
 partitioned by (logtype string)
ROW FORMAT DELIMITED  
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n'
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6'
```

다음 쿼리 문은 Amazon EMR이 Amazon S3에서 생성하는 다양한 로그 유형에 대한 하위 디렉터리를 기반으로 테이블 파티션을 생성합니다.

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='containers')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/containers/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-mapreduce')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-mapreduce/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='hadoop-state-pusher')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/hadoop-state-pusher/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='node')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/node/'
```

```
ALTER TABLE mypartitionedemrlogs ADD
     PARTITION (logtype='steps')
     LOCATION 's3://aws-logs-123456789012-us-west-2/elasticmapreduce/j-2ABCDE34F5GH6/steps/'
```

파티션을 생성한 후 테이블에서 `SHOW PARTITIONS` 쿼리를 실행하여 다음 사항을 확인할 수 있습니다.

```
SHOW PARTITIONS mypartitionedemrlogs;
```

## 예제 쿼리
<a name="emr-example-queries-partitioned"></a>

다음 예제에서는 특정 로그 항목에 대한 쿼리가 위 예제에서 생성된 테이블 및 파티션을 사용한다는 것을 보여줍니다.

**Example - ERROR 또는 WARN에 대한 컨테이너 파티션의 애플리케이션 application\$11561661818238\$10002 로그 쿼리**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='containers'
        AND regexp_like("$PATH",'application_1561661818238_0002')
        AND regexp_like(data, 'ERROR|WARN') limit 100;
```

**Example - 작업 job\$11561661818238\$10004 및 Failed Reduces에 대한 hadoop-Mapreduce 파티션 쿼리**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='hadoop-mapreduce'
        AND regexp_like(data,'job_1561661818238_0004|Failed Reduces') limit 100;
```

**Example - 쿼리 ID 056e0609-33e1-4611-956c-7a31b42d2663에 대한 노드 파티션의 Hive 로그 쿼리**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like("$PATH",'hive')
        AND regexp_like(data,'056e0609-33e1-4611-956c-7a31b42d2663') limit 100;
```

**Example - 애플리케이션 1567660019320\$10001\$101\$1000001에 대한 노드 파티션의 resourcemanager 로그 쿼리**  

```
SELECT data,
        "$PATH"
FROM "default"."mypartitionedemrlogs"
WHERE logtype='node'
        AND regexp_like(data,'resourcemanager')
        AND regexp_like(data,'1567660019320_0001_01_000001') limit 100
```