

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 查詢 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 EMR 設定為自動將日誌檔案存檔至 Amazon S3。您可以使用 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 位置會反映由 Amazon Web Services 帳戶 *123456789012* 在區域 *us-west-2* 中建立之 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 的 hadoop-Mapreduce 分割區和失敗的 Reduce 次數**  

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