

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

# Amazon EMR 开启 EC2 — CloudWatch 使用自定义指标和日志进行增强监控
<a name="enhanced-custom-metrics"></a>

## 概述
<a name="enhanced-custom-metrics-overview"></a>

Amazon EMR 提供强大且经济高效的大数据处理能力。要最大限度地提高性能和资源利用率，有效的监控至关重要。Amazon 为 EMR 集群 CloudWatch 提供了全面的可观察性，使您能够实时跟踪指标和日志。本文档概述了如何执行以下操作：

1. 将 CloudWatch 代理配置为将日志上 EC2 的 EMR 发送到 CloudWatch

1. 通过分类添加自定义 Hadoop、YARN 和 HBase 指标

1. 通过内置控制面板监控指标

1. 通过日志组跟踪集群 CloudWatch 日志

## 先决条件和背景
<a name="enhanced-custom-metrics-prerequisites"></a>

默认情况下，Amazon EMR CloudWatch 每五分钟向其发送一次基本指标，不收取额外费用。在 EMR 7.0\$1 版本中，您可以将代理部署到： CloudWatch 
+ 每隔一分钟收集 34 个额外详细指标（需额外付费）
+ 从所有集群节点收集指标
+ 在将数据发送到主节点之前，先聚合主节点上的数据 CloudWatch
+ 通过 EMR 控制台的 “监控” 选项卡或控制台访问指标 CloudWatch 

EMR 7.1 扩展了这些功能，允许您将代理配置为从 Hadoop、YARN 和组件中捕获专门的指标。 HBase 对于使用 Prometheus 的环境，可以将指标转发到 Amazon Managed Service for Prometheus。

## CloudWatch 日志的代理配置
<a name="enhanced-custom-metrics-agent-config"></a>

要捕获 EMR 登录信息 CloudWatch，请创建一个 c *loudwatch-config.json* 文件来定义要收集哪些日志文件：

**cloudwatch-config.json**

```
{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          { 
            "file_path": "/mnt/var/log/hadoop-yarn/hadoop-yarn-resourcemanager-*",
            "log_group_name": "/emr/yarn/resourcemnger",
            "log_stream_name": "{instance_id}",
            "publish_multi_logs" : true
          },
          { 
            "file_path": "/var/log/hadoop-hdfs/hadoop-hdfs-namenode-*",
            "log_group_name": "/emr/hdfs/namenode",
            "log_stream_name": "{instance_id}",
            "publish_multi_logs" : true
          }
        ]
      }
    }
}
```

## 用于 CloudWatch 代理配置的引导脚本
<a name="enhanced-custom-metrics-bootstrap-script"></a>

要将您的自定义 CloudWatch 配置应用于 EMR 节点，请创建一个引导脚本，该脚本将使用您的设置重新启动 CloudWatch 代理。此脚本可确保在集群预置后，代理使用特定日志收集参数运行。

### 创建引导脚本
<a name="enhanced-custom-metrics-create-bootstrap"></a>

创建一个名为 *cloudwatch-agent-bootstrap.sh* 的文件，其中包含以下内容：

```
#!/bin/bash
set -xe

EMR_SECONDARY_BA_SCRIPT=$(cat <<'EOF'
while true; do
NODEPROVISIONSTATE=$(sed -n '/localInstance [{]/,/[}]/ {/nodeProvisionCheckinRecord [{]/,/[}]/ {/status:/ p}}' /emr/instance-controller/lib/info/job-flow-state.txt | awk '{ print $2 }')

if [ "$NODEPROVISIONSTATE" == "SUCCESSFUL" ]; then
sleep 10
echo "Running my post provision bootstrap"
NODETYPE=$(cat /mnt/var/lib/instance-controller/extraInstanceData.json | jq -r '.instanceRole' | awk '{print tolower($0)}')

# Copy config file on the instance
sudo aws s3 cp s3://amzn-s3-demo-bucket1/cloudwatch-config.json /opt/aws/amazon-cloudwatch-agent/etc/stdout_log_config.json

# Start the agent with the created config file
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a append-config -c file:/opt/aws/amazon-cloudwatch-agent/etc/stdout_log_config.json

# Restart CW Agent
sudo systemctl restart amazon-cloudwatch-agent

# Status CW Agent
echo "Status CW Agent"
sudo /usr/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status

exit
fi

sleep 10
done
EOF
)

echo "${EMR_SECONDARY_BA_SCRIPT}" | tee -a /tmp/emr-secondary-ba.sh
chmod u+x /tmp/emr-secondary-ba.sh
/tmp/emr-secondary-ba.sh > /tmp/emr-secondary-ba.log 2>&1 &
exit 0
```

将示例存储桶替换为您的存储桶名称。

### 重要配置说明
<a name="enhanced-custom-metrics-configuration-note"></a>

**重要**  
上传脚本之前，请将 **<amzn-s3-demo-bucket1>** 替换为您在上一步中存储 *cloudwatch-config.json* 文件的 S3 存储桶的实际名称。这样可以确保引导脚本在集群初始化期间能够检索到您的配置文件。

此引导脚本将：
+ 等待节点预置完成
+ 下载您的自定义 CloudWatch 配置
+ 停止任何正在运行的 CloudWatch 代理
+ 使用您的特定配置重启代理
+ 记录代理的状态以进行故障排除

## Hadoop、YARN 和 HBase
<a name="enhanced-custom-metrics-custom-metric-classifications"></a>

除了默认 CloudWatch 指标外，您还可以通过为 EMR 集群组件配置特定于应用程序的自定义指标来增强监控能力。Amazon EMR 的配置 API 提供了一种灵活的方式来精确定义要收集的指标。

### 配置自定义指标
<a name="enhanced-custom-metrics-configuring-custom-metrics"></a>

您可以通过两种方式实施自定义指标收集：
+ 在为新集群创建集群期间
+ 通过 EMR 控制台重新配置现有集群时

### 创建分类文件
<a name="enhanced-custom-metrics-creating-classification-file"></a>

分类文件定义了应从您的集群中收集哪些特定组件指标。下面是用于收集自定义 Hadoop 指标的示例结构：

```
[
  {
    "Classification": "emr-metrics",
    "Configurations": [
      {
        "Classification": "emr-hadoop-hdfs-datanode-metrics",
        "Properties": {
          "Hadoop:service=DataNode,name=DataNodeActivity-*": "DatanodeNetworkErrors,TotalReadTime,TotalWriteTime,BytesRead,BytesWritten,RemoteBytesRead,RemoteBytesWritten,ReadBlockOpNumOps,ReadBlockOpAvgTime,WriteBlockOpNumOps,WriteBlockOpAvgTime",
          "otel.metric.export.interval": "30000"
        }
      },
      {
        "Classification": "emr-hadoop-yarn-nodemanager-metrics",
        "Properties": {
          "Hadoop:service=NodeManager,name=JvmMetrics": "MemNonHeapUsedM,MemNonHeapCommittedM,MemNonHeapMaxM,MemHeapUsedM,MemHeapCommittedM,MemHeapMaxM,MemMaxM",
          "Hadoop:service=NodeManager,name=NodeManagerMetrics": "ContainerCpuUtilization,NodeCpuUtilization,ContainersCompleted,ContainersFailed,ContainersKilled,ContainersLaunched,ContainersRolledBackOnFailure,ContainersRunning,ContainerUsedMemGB,ContainerUsedVMemGB,ContainerLaunchDurationNumOps,ContainerLaunchDurationAvgTime",
          "otel.metric.export.interval": "20000"
        }
      }
    ],
    "Properties": {}
  }
]
```

### 实施步骤
<a name="enhanced-custom-metrics-implementation-steps"></a>

1. 创建一个包含所需指标分类的 JSON 文件。

1. 根据您的监控要求自定义指标。

1. 保存文件并将其上传到您的 S3 存储桶。

1. 创建新集群或重新配置现有集群时，请引用此文件。

### 最佳实践
<a name="enhanced-custom-metrics-best-practices"></a>
+ 仅收集能够为您的工作负载提供有意义见解的指标。
+ 根据您的监控需求考虑指标收集间隔。
+ 查看 AWS 文档，了解每个组件的可用指标的完整列表。
+ 将相关指标分组到同一分类中，以便更好地进行组织。

这种方法使您能够将监控重点放在特定 EMR 应用程序的最关键指标上，从而更深入地了解集群性能。

## 部署具有集成功能的 EMR 集群 CloudWatch
<a name="enhanced-custom-metrics-emr-cloudwatch-deployment"></a>

按照以下步骤创建 Amazon EMR 集群，该集群会自动将日志和自定义指标发送到： CloudWatch

### 步骤 1：启用代 CloudWatch 理
<a name="enhanced-custom-metrics-enable-cloudwatch-agent"></a>

通过 AWS 管理控制台创建 EMR 集群时：

1. 在创建集群期间，导航到**应用程序**部分。

1. 选中您的主要应用程序（Hadoop、Spark 等）对应的复选框。

1. 滚动查找并选择 **Amazon A CloudWatch gent** 选项。

1. 这将在您的集群上启用代理，这对于收集增强的指标和日志至关重要。

 CloudWatch 代理将安装在集群中的所有节点上，使其能够按配置的时间间隔收集系统和应用程序指标。

![\[应用程序捆绑包\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/metrics_name_applications.png)


**注意**  
该 CloudWatch 代理在 EMR 7.0 及更高版本中可用。需要启用此组件，才能获得本指南所述的自定义指标收集和日志转发。

### 步骤 2：添加用于日志收集的引导操作
<a name="enhanced-custom-metrics-add-bootstrap-action"></a>

要将 CloudWatch 代理配置为收集特定日志文件并将其转发到 CloudWatch：

1. 在 EMR 集群创建向导中，导航到**引导操作**部分

1. 单击**添加引导操作**

1. 从下拉菜单中选择**自定义操作**

1. 为您的引导操作提供一个名称（例如，**配置 CloudWatch 代理**）

1. 在**脚本位置**字段中，输入 cloudwatch-agent-bootstrap .sh 脚本的 S3 路径（例如 s3://your-bucket-name/cloudwatch-agent-bootstrap.sh）

1. 单击**添加**以保存引导操作

此引导操作将在集群启动期间执行，确保使用您的自定义设置正确配置，以收集和转发配置文件中指定的日志文件。 CloudWatchagent 

配置节点后，代理将自动开始收集日志，从而通过 CloudWatch 日志提供对集群操作的近乎实时的可见性。

![\[Bootstrap actions (引导操作)\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/metrics_bootstrap_actions.png)


### 步骤 3：配置自定义指标收集
<a name="enhanced-custom-metrics-configure-custom"></a>

要启用自定义 Hadoop、YARN 或超出默认设置的 HBase 指标的收集，请执行以下操作：

1. 在 EMR 集群创建向导中，导航到**配置**部分。

1. 单击**编辑配置**按钮展开配置选项。

1. 从配置方法下拉列表中选择**从 Amazon S3 加载 JSON** 选项。

1. 输入您的自定义指标分类文件的 S3 URI 路径（例如 s3://amzn-s3-demo-bucket1/ emr-metrics-classification .json）。

1. 单击**加载**以解析配置。

1. 验证配置是否正确显示在控制台界面中。

1. 单击**保存更改**以将这些指标配置应用于您的集群。

此步骤指示 CloudWatch 代理收集分类文件中定义的特定组件指标。这些指标将按您的配置中指定的时间间隔收集并发布到 CloudWatch，在那里可以对其进行可视化和分析。

自定义指标有助于更深入地了解集群的性能特征，从而更精确地监控 EMR 应用程序并排查其问题。

![\[软件设置\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/metrics_software_setting.png)


### 更新正在运行的集群的指标配置
<a name="enhanced-custom-metrics-update-configuration"></a>

您可以按照以下步骤修改现有 EMR 集群的指标收集设置，而不会中断操作：

1. 在 AWS 管理控制台中导航到您的活动 EMR 集群。

1. 在集群详细信息视图中选择**配置**选项卡。

1. 找到**实例组配置**部分。

1. 单击**重新配置**按钮以修改设置。

1. 选择**从 Amazon S3 加载 JSON** 或直接编辑配置。

1. 输入更新过的指标分类文件位置或在编辑器中进行更改。

1. 应用更改以更新指标收集行为。

利用这种重新配置功能，您能够根据工作负载要求的变化微调监控方法。 CloudWatch 代理将自动适应新的配置，无需重新启动集群或停机即可收集更新的指标集。

**重要**  
配置更改可能需要几分钟才能传播到集群中的所有节点。继续监控您的 CloudWatch 仪表板，以确认新指标按预期显示。

![\[Configurations tab showing 集群 and instance group settings with options to view JSON and reconfigure.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/metrics_cluster_config.png)


## 验证您的集成 CloudWatch
<a name="enhanced-custom-metrics-validating-cloudwatch"></a>

完成配置步骤后，请验证您的监控设置是否正常工作：

### 步骤 1：部署 EMR 集群
<a name="enhanced-custom-metrics-deploy-emr-cluster"></a>

1. 检查所有配置设置是否准确。

1. 确保正确引用引导操作和分类文件。

1. 单击**创建集群**以启动您的 EMR 环境。

1. 等待集群进入**正在运行**状态（通常为 5-15 分钟）。

### 步骤 2：执行测试应用程序
<a name="enhanced-custom-metrics-execute-test"></a>

提交多个测试 Spark 应用程序以生成有意义的指标：
+ 运行一个简单的 Spark 作业来处理示例数据。
+ 执行运行时间较长的分析任务以观察资源利用率。
+ 测试不同的应用程序配置以比较性能指标。

应用程序完成后（或正在运行时）：
+ 导航到 CloudWatch 控制台。
+ 检查您配置的日志组中的应用程序日志。
+ 查看指标控制面板，观察 CPU、内存和应用程序特定的指标。
+ 验证分类文件中定义的自定义指标是否出现在中 CloudWatch。

此验证过程可确认您的 CloudWatch 集成是否正确捕获了日志和指标，从而使您可以全面了解 EMR 集群的性能和应用程序行为。

## 访问日志组中的 CloudWatch EMR 日志
<a name="enhanced-custom-metrics-accessing-emr-logs"></a>

在 EMR 集群运行并正确配置 CloudWatch 代理之后，您的应用程序和系统日志将显示在日志中 CloudWatch 。请按照以下步骤访问和分析它们：

### 查看日志组
<a name="enhanced-custom-metrics-viewing-log-groups"></a>

1. 在 AWS 管理 CloudWatch 控制台中导航到控制台。

1. 在左侧导航窗格中，选择**日志组**。

1. 查找由您的配置创建的日志组，例如：
   + /emr/yarn/resourcemnger用于 YARN ResourceManager 日志。
   + /emr/hdfs/namenode用于 HDFS NameNode 日志。
   + 您的配置文件中指定的任何其他日志组。

每个日志组都包含按实例 ID 组织的日志流，使您能够跟踪集群中特定节点的日志。

### 使用日志数据
<a name="enhanced-custom-metrics-working-with-log-data"></a>
+ *搜索日志数据：*使用 Lo CloudWatch gs Insights 在日志组中执行结构化查询。
+ *创建指标：*从日志模式中提取指标以创建自定义 CloudWatch 指标。
+ *设置警报：*根据特定错误模式或日志频率配置警报。
+ *导出日志：*下载日志以进行离线分析或存档。

### 日志保留
<a name="enhanced-custom-metrics-log-retention"></a>

**注意**  
默认情况下，日志保留 30 天。您可以修改每个日志组的保留策略，以便出于合规性或分析目的根据需要将日志保留更长时间。

CloudWatch 日志为您的所有 EMR 日志数据提供了一个集中位置，无需通过 SSH 连接到各个集群节点来解决问题或分析应用程序行为。

## 在 EMR 监控控制面板中查看自定义指标
<a name="viewing-custom-metrics"></a>

使用 CloudWatch 代理和自定义指标配置运行 EMR 集群后，您可以直接在 EMR 控制台中轻松监控这些指标：

### 访问自定义指标
<a name="accessing-custom-metrics"></a>

1. 在 AWS 管理控制台中导航到您的 EMR 集群。

1. 在集群详细信息页面中选择**监控**选项卡。

1. 在监控控制面板顶部附近找到**筛选指标分类**下拉列表。

1. 使用此筛选条件来选择特定指标类别：
   + 选择要查看**的 HDFS** NameNode 和 DataNode 指标。
   + 选择 **YARN** 以查看 ResourceManager 容器指标。
   + 选择 HBase特**HBase**定的性能数据。
   + 选择您定义的自定义指标分类。

控制面板将动态更新以显示所选指标的图表，展示一段时间内的性能趋势。

### 使用指标可视化
<a name="working-with-metric-visualizations"></a>
+ *调整时间范围：*更改时间段以查看近期活动或历史趋势。
+ *比较指标：*显示多个相关指标 side-by-side以进行相关性分析。
+ *缩放功能：*聚焦于出现异常或模式的特定时间段。
+ *刷新数据：*使用最新的指标数据近乎实时地更新可视化。

利用这种集成监控方法，您可以在统一的控制面板中跟踪标准 EMR 指标和自定义指标，从而更轻松地识别性能问题、资源限制或应用程序瓶颈，而无需离开 EMR 控制台。

![\[EMR 集群 monitoring dashboard showing CloudWatch metrics and filter options.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/metrics_cloudwatch_metrics.png)
