

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 配置 Amazon EMR 集群日志记录和调试
<a name="emr-plan-debugging"></a>

在规划集群时要确定的事项之一是您希望提供多少调试支持。当首次开发数据处理应用程序时，我们建议您在集群上测试该应用程序，处理一小部分但具有代表性的数据子集。执行此操作时，您可能希望利用 Amazon EMR 提供的所有调试工具，如将日志文件存档到 Amazon S3。

在完成开发和将数据处理应用程序投入全面生产后，您可以选择缩减调试。这样做可以节省在 Amazon S3 中存储日志文件存档的成本，并降低数据库上的处理负载，因为不再需要向 Amazon S3 写入状态。当然，如果这样做，在出现错误时可用于调查问题的工具则会相对较少。

## 默认日志文件
<a name="emr-plan-debugging-logs"></a>

默认情况下，每个集群在所有节点上写入日志文件。这些文件将写入 `/mnt/var/log/` 目录。您可以使用 SSH 连接到任何节点来访问它们，如中所述[使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。Amazon EMR 会收集 Amazon EMR 进程守护程序和其他 Amazon EMR 进程生成的某些系统和应用程序日志，以确保有效的服务操作。

**注意**  
如果您使用的是 Amazon EMR 6.8.0 或更早版本，则在集群终止期间，日志文件不会保存到 Amazon S3，因此节点终止后您将无法访问日志文件。如果使用 Amazon EMR 6.9.0 发行版及更高版本，集群缩减期间日志文件会存档到 Amazon S3，因此即使在节点终止后，集群上生成的日志文件仍然存在。

您无需启用任何功能即可在所有节点上写入日志文件。这是 Amazon EMR 和 Hadoop 的默认行为。

Amazon EMR 会为 S3 日志捕获三类日志：
+ **系统日志**：EMR 守护程序日志
+ **应用程序日志**：来自 Hadoop、Spark、Hive 和集群上运行的其他应用程序的框架日志
+ **永久用户界面日志**：永久性应用程序（ UIs 例如 Spark History Server 和 Tez UI）所需的日志

在本地文件系统上，群集在中生成多种类型的日志文件`/mnt/var/log`，包括：
+ **步骤日志**：这些日志由 Amazon EMR 服务生成，包含集群的相关信息和每个步骤的结果。日志文件存储在主节点上的 `/mnt/var/log/hadoop/steps/` 目录中。每个步骤都将其结果记录在单独编号的子目录中：第一步的子目录为 `/mnt/var/log/hadoop/steps/s-stepId1/`，第二步为 `/mnt/var/log/hadoop/steps/s-stepId2/`，依此类推。13 个字符的步骤标识符 (如 stepId1、stepId2) 对集群来说是唯一的。
+ **Hadoop 和 YARN 组件日志** — 与 Apache YARN 和 MapReduce（例如）关联的组件的日志包含在所有节点的单独文件夹中`/mnt/var/log`。`/mnt/var/log` 下 Hadoop 组件的日志文件位置有：hadoop-hdfs、hadoop-mapreduce、hadoop-httpfs 和 hadoop-yarn。该hadoop-state-pusher 目录用于存放 Hadoop 状态推送器进程的输出。
+ **引导操作日志**：如果您的任务使用引导操作，则会记录这些操作的结果。日志文件存储在所有节点上的/mnt/var/log/bootstrap-actions/ 中。每个引导操作都将其结果记录在单独编号的子目录中：第一个引导操作的子目录为 `/mnt/var/log/bootstrap-actions/1/`、第二个引导操作为 ` /mnt/var/log/bootstrap-actions/2/`，依此类推。
+ **实例状态日志**：这些日志提供有关 CPU、内存状态和节点的垃圾收集器线程的信息。日志文件存储在所有节点`/mnt/var/log/instance-state/`上。

## 将日志文件归档到 Amazon S3
<a name="emr-plan-debugging-logs-archive"></a>

**注意**  
您目前不能通过 `yarn logs` 实用工具对 Amazon S3 使用日志聚合。

如果使用 Amazon EMR 6.9.0 发行版及更高版本，集群缩减期间日志文件会存档到 Amazon S3，因此即使在节点终止后，集群上生成的日志文件仍然存在。此行为会自动启用，因此您无需执行任何操作即可将其打开。对于 Amazon EMR 6.8.0 及更早版本，您可以将集群配置为定期将存储在所有节点上的日志文件存档到 Amazon S3。这可确保集群终止后（无论是正常关闭或是由于错误所致），日志文件仍可用。Amazon EMR 每隔 5 分钟便将日志文件归档到 Amazon S3。

要将 Amazon EMR 发行版 6.8.0 及更早版本的日志文件存档到 Amazon S3，您必须在启动集群时启用此功能。您可以使用控制台、CLI 或 API 执行此操作。默认情况下，使用控制台启动的集群已启用日志存档。对于使用 CLI 或 API 启动的集群，必须手动启用到 Amazon S3 的日志记录。

------
#### [ Console ]

**使用新控制台将日志文件存档到 Amazon S3**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Cluster logs**（集群日志）下，选中 **Publish cluster-specific logs to Amazon S3**（将集群特定日志发布到 Amazon S3）复选框。

1. 在 **Amazon S3 location**（Amazon S3 位置）字段中，键入（或浏览到）存储日志的 Amazon S3 路径。如果键入的文件夹名称在存储桶中不存在，Amazon S3 将创建该文件夹。

   设定此值后，Amazon EMR 会将日志文件从集群中的 EC2 实例复制到 Amazon S3。这可以防止在集群终止及托管集群的 EC2 实例终止时丢失日志文件。这些日志在排除故障时非常有用。有关更多信息，请参阅[查看日志文件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)。

1. （可选）选中 **Encrypt cluster-specific logs**（加密集群特定的日志）复选框。然后，从列表中选择 AWS KMS 密钥、输入密钥 ARN 或创建新密钥。此选项仅适用于 Amazon EMR 5.30.0 及更高版本（不包括 6.0.0）。要使用此选项，请添加 AWS KMS 对您的 EC2 实例配置文件和 Amazon EMR 角色的权限。有关更多信息，请参阅 [使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件](#emr-log-encryption)。

1. 选择适用于集群的任何其他选项。

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ CLI ]

**使用将日志文件存档到 Amazon S3 AWS CLI**

要使用将日志文件存档到 Amazon S3 AWS CLI，请键入`create-cluster`命令并使用`--log-uri`参数指定 Amazon S3 日志路径。

1. 要将文件记录到 Amazon S3，请键入以下命令并*myKey*替换为您的 EC2 密钥对的名称。

   ```
   aws emr create-cluster --name "Test cluster" --release-label emr-7.12.0 --log-uri s3://DOC-EXAMPLE-BUCKET/logs --applications Name=Hadoop Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey --instance-type m5.xlarge --instance-count 3
   ```

1. 如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。
**注意**  
如果您之前未创建默认 Amazon EMR 服务角色和 EC2 实例配置文件，请先输入 `aws emr create-default-roles` 进行创建，然后键入 `create-cluster` 子命令。

------

### 使用 AWS KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件
<a name="emr-log-encryption"></a>

使用亚马逊 EMR 5.30.0 及更高版本（亚马逊 EMR 6.0.0 除外），您可以使用 KMS 客户托管密钥加密存储在 Amazon S3 中的日志文件。 AWS 要在控制台中启用此选项，请按照[将日志文件归档到 Amazon S3](#emr-plan-debugging-logs-archive)中的步骤进行操作。您的 Amazon EC2 实例配置文件和 Amazon EMR 角色必须满足以下先决条件：
+ 用于您的集群的 Amazon EC2 实例配置文件必须有权使用 `kms:GenerateDataKey`。
+ 用于您的集群的 Amazon EMR 角色必须有权使用 `kms:DescribeKey`。
+ 必须将 Amazon EC2 实例配置文件和 Amazon EMR 角色添加到指定 AWS KMS 客户托管密钥的密钥用户列表中，如以下步骤所示：

  1. 在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

  1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

  1. 选择要修改的 KMS 密钥的别名。

  1. 在密钥详细信息页面的 **Key Users (密钥用户)** 下，选择 **Add (添加)**。

  1. 在 **Add key users (添加密钥用户)**对话框中，选择您的 Amazon EC2 实例配置文件和 Amazon EMR 角色。

  1. 选择**添加**。
+ 您还必须配置 KMS 密钥以允许 `persistentappui.elasticmapreduce.amazonaws.com` 和 `elasticmapreduce.amazonaws.com` 服务主体使用 `kms:GenerateDataKey`、`kms:GenerateDataKeyWithoutPlaintext` 和 `kms:Decrypt`。这样，EMR 就可以读取使用 KMS 密钥加密的日志并将其写入托管存储。用户 IAM 角色必须具有使用 `kms:GenerateDataKey` 和 `kms:Decrypt` 的权限。

  ```
  {
     "Sid": "Allow User Role to use KMS key",
     "Effect": "Allow",
     "Principal": {
          "AWS": "User Role"
      },
      "Action": [
          "kms:Decrypt", 
          "kms:GenerateDataKey"
     ],
      "Resource": "*",
      "Condition": {
          "StringLike": {
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*",
             "kms:ViaService": "elasticmapreduce.region.amazonaws.com"
         }
      }
  },
  {
      "Sid": "Allow Persistent APP UI to validate KMS key for write",
      "Effect": "Allow",
      "Principal":{
          "Service": [
              "elasticmapreduce.amazonaws.com"
          ]
       },
       "Action": [
         "kms:GenerateDataKeyWithoutPlaintext"
        ],
       "Resource": "*",
       "Condition": {
          "StringLike": {
              "aws:SourceArn": "arn:aws:elasticmapreduce:region:account:cluster/j-*",
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*"
          }
       }
  },
  {
      "Sid": "Allow Persistent APP UI to Write/Read Logs",
      "Effect": "Allow",
      "Principal":{
          "Service": [
              "persistentappui.elasticmapreduce.amazonaws.com",
              "elasticmapreduce.amazonaws.com"
          ]
       },
       "Action": [
         "kms:Decrypt",
         "kms:GenerateDataKey"
       ],
       "Resource": "*",
       "Condition": {
          "StringLike": {
              "aws:SourceArn": "arn:aws:elasticmapreduce:region:account:cluster/j-*",
              "kms:EncryptionContext:aws:elasticmapreduce:clusterId": "j-*",
              "kms:ViaService": "s3.region.amazonaws.com"
          }
       }
  }
  ```

  作为安全最佳实践，我们建议您添加 `aws:SourceArn` 和 `kms:EncryptionContext` 条件。这些条件有助于确保密钥仅供 Amazon EMR on EC2 使用，并且仅用于在虚拟集群中运行的作业生成的日志。

有关更多信息，请参阅 [Amazon EMR 使用的 IAM 服务角色](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-service-roles.html)和[密钥管理服务开发者指南中的使用 AWS 密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。

### 使用 Amazon S3 中聚合日志 AWS CLI
<a name="emr-log-aggregate-CLI"></a>
**注意**  
您目前不能通过 `yarn logs` 实用工具使用日志聚合。您只能使用此过程支持的聚合。

日志聚合 (Hadoop 2.x) 将日志从单个应用程序的所有容器汇总到单个文件中。要使用启用到 Amazon S3 的日志聚合 AWS CLI，您可以在集群启动时使用引导操作来启用日志聚合并指定存储日志的存储桶。
+ 要启用日志聚合，请创建名为 `myConfig.json` 的下列配置文件，其中包含以下内容：

  ```
  [
    {
      "Classification": "yarn-site",
      "Properties": {
        "yarn.log-aggregation-enable": "true",
        "yarn.log-aggregation.retain-seconds": "-1",
        "yarn.nodemanager.remote-app-log-dir": "s3:\/\/DOC-EXAMPLE-BUCKET\/logs"
      }
    }
  ]
  ```

  请键入以下命令，将 *`myKey`* 替换为您的 EC2 密钥对的名称。您还可以将任何红色文本替换为自己的配置。

  ```
  aws emr create-cluster --name "Test cluster" \
  --release-label emr-7.12.0 \
  --applications Name=Hadoop \
  --use-default-roles \
  --ec2-attributes KeyName=myKey \
  --instance-type m5.xlarge \
  --instance-count 3 \
  --configurations file://./myConfig.json
  ```

  如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。
**注意**  
如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件，请先运行 `aws emr create-default-roles` 以创建它们，然后再运行 `create-cluster` 子命令。

有关在中使用 Amazon EMR 命令的更多信息 AWS CLI，请参阅[AWS CLI 命令](https://docs.aws.amazon.com/cli/latest/reference/emr)参考。

### Amazon EMR 自我诊断和故障排除工具
<a name="emr-troubleshooting-saw-diagnostics"></a>

此运行手册可帮助识别在 Amazon EMR 集群上运行任务时出现的错误。运行手册分析文件系统上已定义日志的列表，并查找预定义关键字的列表。这些日志条目用于创建 Amazon Events CloudWatch 事件，因此您可以根据事件采取任何必要的操作。或者，运行手册将日志条目发布到您选择的 Amazon Log CloudWatch s 日志组。 [AWSSupport-AnalyzeEMRLogs](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-analyzeemrlogs.html)。

本运行手册使用与 Glue 数据目录集成的亚马逊 Athena 帮助诊断 S3 上的亚马逊 EMR 日志。 AWS Amazon Athena 用于查询 Amazon EMR 日志文件，以获取容器日志和/或节点日志以及特定日期范围或基于关键字的搜索的可选参数。此运行手册提供在 Amazon EMR 集群日志中找到的所有错误和常见异常的列表，以及相应的 S3 日志位置。它还提供了 Amazon EMR 日志中匹配的唯一已知异常的摘要，以及建议的解决方案和知识中心/re: Post 文章，以帮助进行故障排除。[AWSSupport-DiagnoseEMRLogsWithAthena](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/awssupport-diagnose-emr-logs-with-athena.html)

## 日志位置
<a name="emr-log-list"></a>

以下列表包括了所有日志类型及其在 Amazon S3 中的位置。您可以使用这些日志来排查 Amazon EMR 问题。

**步骤日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/steps/<step-id>/`

**应用程序日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/containers/`  
此位置包含容器 `stderr` 以及 `stdout`、`directory.info`、`prelaunch.out` 和 `launch_container.sh` 日志。

**资源管理器日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hadoop-yarn/`

**Hadoop HDFS**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-hdfs/`  
此位置包括 NameNode DataNode、和 YARN TimelineServer 日志。

**节点管理器日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/applications/hadoop-yarn/`

**实例状态日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<all-instance-id>/daemons/instance-state/`

**Amazon EMR 预调配日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/provision-node/*`

**Hive 日志**  
`s3://DOC-EXAMPLE-LOG-BUCKET/<cluster-id>/node/<leader-instance-id>/applications/hive/*`  
+ 要查找集群上的 Hive 日志，请删除星号（`*`）并将 `/var/log/hive/` 附加上面的链接后。
+ 要查找 HiveServer 2 个日志，请删除星号 (`*`) 并附加`var/log/hive/hiveserver2.log`到上面的链接。
+ 要查找 HiveCLI 日志，请删除星号（`*`）并将 `/var/log/hive/user/hadoop/hive.log` 附加上面的链接后。
+ 要查找 Hive Metastore Server 日志，请删除星号（`*`）并将 `/var/log/hive/user/hive/hive.log` 附加上面的链接后。
如果故障位置在 Tez 应用程序的主节点或任务节点上，请提供相应的 Hadoop 容器日志。

## 控制 S3 日志行为（亚马逊 EMR 7.13.0 及更高版本）
<a name="s3-logging-configuration"></a>

从 Amazon EMR 7.13.0 开始，您可以通过 S3 功能控制上传行为。LoggingConfiguration 这允许您为不同的日志类型指定不同的上传策略：系统日志、应用程序日志和永久用户界面日志。

### 上传政策
<a name="s3-logging-upload-policies"></a>

对于每种日志类型，您可以指定以下上传策略之一。未指定的日志类型将默认为标准行为（emr 管理）：

**emr 管理（默认）**  
标准行为。日志将按照您的配置上传到 Amazon S3LogUri，服务会保留某些日志，用于运营支持和故障排除。

**on-customer-s只有 3 个**  
仅限客户管理的存储。日志仅上传到客户指定的 S3 存储桶。这要求您在创建集群 LogUri时指定。 Persistent-ui-logs不能有on-customer-s仅限 3 的策略。允许的策略由 emr 管理且 persistent-ui-logs已禁用。

**disabled**  
此日志类型未上传 S3。

### 配置示例
<a name="s3-logging-config-examples"></a>

在创建新的 Amazon EMR 集群时，您可以通过或配置 S3 日志记录。 AWS CLI AWS SDKs配置通过MonitoringConfiguration 参数指定。

**示例：默认行为**  
如果您未指定 S3LoggingConfiguration，则所有日志类型都默认为 emr 托管行为：

```
aws emr create-cluster \
--name "MyCluster" \
--release-label emr-7.13.0 \
--instance-type m5.xlarge \
--instance-count 3 \
--log-uri s3://my-bucket/logs/ \
--use-default-roles
```

**示例：自定义 S3 日志配置**  
此示例说明如何为每种日志类型配置不同的上传策略：

```
aws emr create-cluster \
--name "MyCluster" \
--release-label emr-7.13.0 \
--instance-type m5.xlarge \
--instance-count 3 \
--log-uri s3://my-bucket/logs/ \
--use-default-roles \
--monitoring-configuration '{
    "S3LoggingConfiguration": {
        "LogTypeUploadPolicy": {
            "application-logs": "on-customer-s3only",
            "persistent-ui-logs": "disabled"
        }
    }
}'
```

此配置仅将应用程序日志上传到客户 S3 存储桶，并完全禁用永久性 UI 日志上传。未指定的日志类型（系统日志）遵循默认（emr 管理）行为。

### 注意事项
<a name="s3-logging-considerations"></a>
+ S3 日志记录配置只能在创建集群时进行设置，并且无法针对正在运行的集群进行修改。
+ Persistent-ui-logs 不能有 on-customer-s仅限 3 的策略。允许的策略由 emr 管理且 persistent-ui-logs已禁用。
+ **LogUri 要求**：对系统日志或应用程序日志使用 on-customer-s 3only 策略时，必须指定一个参数。 LogUri否则 LogUri，集群创建将失败。
+ **默认行为**：如果未指定 S3，LoggingConfiguration 则所有日志类型都默认为 emr 管理的行为。