

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

# 管理 Amazon EMR 集群


 启动集群后，就可以连接并管理集群。Amazon EMR 提供了一系列可用于执行此操作的工具。本节提供了有关连接到集群、为其分配工作、监控工作完成情况以及故障排除问题的指导。

**Topics**
+ [

# 连接到 Amazon EMR 集群
](emr-connect-master-node.md)
+ [

# 将工作提交到 Amazon EMR 集群
](emr-work-with-steps.md)
+ [

# 在 Amazon EMR 集群执行工作时查看和监控
](emr-manage-view.md)
+ [

# 使用 Amazon EMR 集群扩展来适应不断变化的工作负载
](emr-scale-on-demand.md)
+ [

# 终止处于启动、运行或等待状态的 Amazon EMR 集群
](UsingEMR_TerminateJobFlow.md)
+ [

# 使用控制台克隆 Amazon EMR 集群
](clone-console.md)
+ [

# 使用自动执行重复出现的 Amazon EMR 集群 Amazon Data Pipeline
](emr-manage-recurring.md)

# 连接到 Amazon EMR 集群


运行 Amazon EMR 集群时，通常只需运行一个应用程序来分析您的数据，然后从 Amazon S3 存储桶收集输出即可。而有的时候，您可能希望在集群运行期间与主节点进行交互。例如，您可能要连接到主节点，从而运行交互式查询、检查日志文件、调试与集群有关的问题、使用在主节点上运行的应用程序（如 Ganglia）监控性能等。以下部分介绍了可用于连接到主节点的技术。

在 EMR 集群中，主节点是一种 Amazon EC2 实例，能够协调正以任务节点和核心节点的形式运行的 EC2 实例。主节点可用于与其公有 DNS 名称进行连接。默认情况下，Amazon EMR 会为主节点、核心节点和任务节点创建决定节点访问方式的安全组规则。

**注意**  
您仅可以在集群运行期间连接到主节点。集群终止时，充当主节点的 EC2 实例会终止，将不再可用。要连接到主节点，您还必须对集群进行身份验证。您可以使用 Kerberos 进行身份验证，或者在启动集群时指定 Amazon EC2 密钥对私有密钥。有关配置 Kerberos 然后进行连接的更多信息，请参阅[使用 Kerberos 通过 Amazon EMR 进行身份验证](emr-kerberos.md)。在您从控制台启动集群时，需在 **Create Cluster (创建集群)** 页面上的 **Security and Access (安全与访问)** 部分中指定 Amazon EC2 密钥对私有密钥。

默认情况下， ElasticMapReduce-master 安全组不允许入站 SSH 访问。您可能需要添加一个入站规则，以允许从您想访问的源进行 SSH 访问（TCP 端口 22）。有关修改安全组规则的更多信息，请参阅《Amazon EC2 用户指南》**中的[向安全组添加规则](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-network-security.html)。

**重要**  
请勿修改 ElasticMapReduce-master 安全组中的其余规则。修改这些规则可能会干扰集群的操作。

**Topics**
+ [

# 连接到 Amazon EMR 之前：授权入站流量
](emr-connect-ssh-prereqs.md)
+ [

# 使用 SSH 连接到 Amazon EMR 集群主节点
](emr-connect-master-node-ssh.md)

# 连接到 Amazon EMR 之前：授权入站流量
连接之前

您必须先授权来自信任客户端（例如您电脑的 IP 地址）的入站 SSH 流量（端口 22），然后才能连接到 Amazon EMR 集群。为此，请为要连接的节点编辑托管式安全组规则。例如，以下说明说明如何为默认 ElasticMapReduce-master 安全组的 SSH 访问添加入站规则。

有关结合使用 Amazon EMR与安全组的更多信息，请参阅[使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md)。

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

**使用控制台向受信任来源授予对主要安全组的 SSH 访问权限**

要编辑安全组，您必须具有权限来管理集群所在 VPC 的安全组。有关更多信息，请参阅《IAM 用户指南》**中的[更改用户的权限](https://docs.amazonaws.cn//IAM/latest/UserGuide/id_users_change-permissions.html)和允许管理 EC2 安全组的[示例策略](https://docs.amazonaws.cn//IAM/latest/UserGuide/reference_policies_examples_ec2_securitygroups-vpc.html)。

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。集群详细信息页面随即打开。将预先选择此页面上的 **Properties**（属性）选项卡。

1. 在 **Properties**（属性）选项卡的 **Networking**（联网）下，选择 **EC2 security groups (firewall)** [EC2 安全组（防火墙）] 旁边的箭头以展开此部分。在 **Primary node**（主节点）下，选择安全组链接。此操作将打开 EC2 控制台。

1. 选择 **Inbound rules**（入站规则）选项卡，然后选择 **Edit inbound rules**（编辑入站规则）。

1. 通过以下设置检查允许公有访问的入站规则。如果存在，请选择 **Delete (删除)** 以将其删除。
   + **Type**

     SSH
   + **端口**：

     22
   + **源**

     自定义 0.0.0.0/0
**警告**  
2020 年 12 月之前， ElasticMapReduce-master 安全组预先配置了规则，允许所有来源的端口 22 上的入站流量。创建此规则可简化与主节点的初始 SSH 客户端连接。我们强烈建议您移除此入站规则，限制流量进入可信来源。

1. 滚动到规则列表的底部并选择 **Add Rule (添加规则)**。

1. 对于**Type (类型)**，选择 **SSH**。此选择将自动为 **Protocol**（协议）输入 **TCP**，为 **Port Range**（端口范围）输入 **22**。

1. 针对源，选择 **My IP（我的 IP）**，自动添加您的 IP 地址作为源地址。您也可以添加一系列 **Custom (自定义)** 可信客户端 IP 地址，或创建针对其他客户端的其他规则。许多网络环境动态分配 IP 地址，因此您以后可能需要更新受信任客户端的 IP 地址。

1. 选择**保存**。

1. 您可以选择返回步骤 3，选择 **Core and task nodes**（核心节点和任务节点），然后重复步骤 4 - 8。这会向核心节点和任务节点授予 SSH 客户端访问权限。

------

# 使用 SSH 连接到 Amazon EMR 集群主节点


Secure Shell（SSH）是您可用于创建远程电脑安全连接的网络协议。建立连接后，请如同在远程电脑上运行那样，操作您在本地计算机上的终端。您在本地发出的命令会在远程电脑上运行，同时，远程计算机的命令输出将显示在终端窗口中。

使用 SSH 时 Amazon，您正在连接到 EC2 实例，该实例是在云中运行的虚拟服务器。与 Amazon EMR 结合使用时，SSH 最常见的用途是连接到充当集群主节点的 EC2 实例。

使用 SSH 连接到主节点可让您监控集群并与集群交互。您可以在主节点上发出 Linux 命令、以交互方式运行应用程序（如 Hive 和 Pig）、浏览目录、读取日志文件等。您还可以在 SSH 连接中创建隧道，以查看主节点上托管的 Web 界面。有关更多信息，请参阅 [查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。

要使用 SSH 连接到主节点，您需要主节点的公有 DNS 名称。此外，与主节点关联的安全组必须具有入站规则，此规则允许来自源（其中包含发起 SSH 连接的客户端）的 SSH（TCP 端口 22）流量。您可能需要添加规则，以允许客户端通过 SSH 连接。有关修改安全组规则的更多信息，请参阅《Amazon EC2 用户指南》**中的 [使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md) 和[向安全组添加规则](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-network-security.html)。

## 检索主节点的公有 DNS 名称


您可以使用 Amazon EMR 控制台和 Amazon CLI检索主节点的公有 DNS 名称。

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

**使用新控制台检索主节点的公有 DNS 名称**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要检索公有 DNS 名称的集群。

1. 记下显示在集群详细信息页面上 **Summary**（摘要）部分中的 **Primary node public DNS**（主节点公有 DNS）值。

------
#### [ CLI ]<a name="emr-connect-master-dns-cli"></a>

**使用以下命令检索主节点的公有 DNS 名称 Amazon CLI**

1. 要检索集群标识符，请键入以下命令。

   ```
   1. aws emr list-clusters
   ```

   输出列出了您的集群，包括集群 IDs。记下您连接的集群的集群 ID。

   ```
   "Status": {
       "Timeline": {
           "ReadyDateTime": 1408040782.374,
           "CreationDateTime": 1408040501.213
       },
       "State": "WAITING",
       "StateChangeReason": {
           "Message": "Waiting after step completed"
       }
   },
   "NormalizedInstanceHours": 4,
   "Id": "j-2AL4XXXXXX5T9",
   "Name": "My cluster"
   ```

1. 要列出集群实例（包括集群的公有 DNS 名称），请键入以下命令之一。*j-2AL4XXXXXX5T9*替换为上一个命令返回的集群 ID。

   ```
   1. aws emr list-instances --cluster-id j-2AL4XXXXXX5T9
   ```

   或：

   ```
   aws emr describe-cluster --cluster-id j-2AL4XXXXXX5T9
   ```

   输出会列出集群实例（包括 DNS 名称和 IP 地址）。记下 `PublicDnsName` 值。

   ```
   "Status": {
       "Timeline": {
           "ReadyDateTime": 1408040779.263,
           "CreationDateTime": 1408040515.535
       },
       "State": "RUNNING",
       "StateChangeReason": {}
   },
   "Ec2InstanceId": "i-e89b45e7",
   "PublicDnsName": "ec2-###-##-##-###.us-west-2.compute.amazonaws.com"
   
   "PrivateDnsName": "ip-###-##-##-###.us-west-2.compute.internal",
   "PublicIpAddress": "##.###.###.##",
   "Id": "ci-12XXXXXXXXFMH",
   "PrivateIpAddress": "###.##.#.###"
   ```

有关更多信息，请参阅 [Amazon CLI中的 Amazon EMR 命令](https://docs.amazonaws.cn/cli/latest/reference/emr)。

------

## 在 Linux、Unix 和 Mac OS X 上使用 SSH 和 Amazon EC2 私有密钥连接到主节点


要创建使用私有密钥文件进行身份验证的 SSH 连接，您需要在启动集群时指定 Amazon EC2 密钥对私有密钥。有关访问密钥对的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。

默认情况下，您的 Linux 电脑很可能包含 SSH 客户端。例如，大多数 Linux、Unix 和 macOS 操作系统上都会安装 OpenSSH。您可以通过在命令行键入 **ssh** 来检查 SSH 客户端。如果您的计算机无法识别该命令，请安装 SSH 客户端以连接到主节点。OpenSSH 项目会免费提供一套完整的 SSH 工具执行文件。有关更多信息，请访问 [OpenSSH](http://www.openssh.org/) 网站。

以下说明演示了如何在 Linux、Unix 和 Mac OS X 上打开与 Amazon EMR 主节点的 SSH 连接。<a name="emr-keypair-file-permission-config"></a>

**配置密钥对私有密钥文件权限**

您必须先对 `.pem` 文件设置权限，以便只有密钥所有者才有权访问该文件，然后才能使用 Amazon EC2 密钥对私有密钥创建 SSH 连接。这是使用终端或创建 SSH 连接所必需的 Amazon CLI。

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 找到您的 `.pem` 文件。这些说明假定文件名为 `mykeypair.pem`，并将其存储在当前用户的主目录中。

1. 键入以下命令以设置权限。*\$1/mykeypair.pem*替换为 keypair 私钥文件的完整路径和文件名。例如 `C:/Users/<username>/.ssh/mykeypair.pem`。

   ```
   1. chmod 400 ~/mykeypair.pem
   ```

   如果您没有对 `.pem` 文件设置权限，您将收到一条错误消息，指出您的密钥文件不受保护，并且密钥将被拒绝。您只需在第一次使用密钥对私有密钥文件时设置权限即可连接。<a name="emr-ssh"></a>

**使用终端连接到主节点**

1. 打开终端窗口。在 Mac OS X 上，选择 **Applications (应用程序) > Utilities (实用程序) > Terminal (终端)**。在其它 Linux 发布版上，终端通常位于 **Applications (应用程序) > Accessories (附件) > Terminal (终端)**。

1. 要建立与主节点的连接，请键入以下命令。*ec2-\$1\$1\$1-\$1\$1-\$1\$1-\$1\$1\$1.compute-1.amazonaws.com*替换为集群的主公有 DNS 名称，*\$1/mykeypair.pem*替换为文件的完整路径和`.pem`文件名。例如 `C:/Users/<username>/.ssh/mykeypair.pem`。

   ```
   1. ssh hadoop@ec2-###-##-##-###.compute-1.amazonaws.com -i ~/mykeypair.pem
   ```
**重要**  
连接到 Amazon EMR 主节点时，必须使用登录名 `hadoop`，否则可能会遇到类似于 `Server refused our key` 的错误。

1. 警告指出无法验证您正在连接的主机真实性。键入 `yes` 以继续。

1.  完成主节点上的工作以后，键入以下命令，以关闭 SSH 连接。

   ```
   exit
   ```

如果您在使用 SSH 连接到主节点时遇到困难，请参阅[排查实例的连接问题](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)。

## 在 Windows 上使用 SSH 连接到主节点


Windows 用户可以使用 SSH 客户端（如 PuTTY）连接到主节点。在连接到 Amazon EMR 主节点之前，您应该下载并安装 Putty 和 Pu。TTYgen可以从 [PuTTY 下载页面](http://www.chiark.greenend.org.uk/~sgtatham/putty/)下载这些工具。

PuTTY 本身不支持 Amazon EC2 生成的密钥对私有密钥文件格式（`.pem`）。您可以使用 Pu 将密钥文件TTYgen 转换为所需的 PuTTY 格式 () `.ppk`。您必须将密钥转换为此格式 (`.ppk`)，然后才能尝试使用 PuTTY 连接到主节点。

有关转换密钥的更多信息，请参阅 *Amazon EC2 用户指南TTYgen*中的[使用 Pu 转换私钥](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/putty.html)。<a name="emr-ssh-windows"></a>

**使用 PuTTY 连接到主节点**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 打开 `putty.exe`。也可以从 Windows 程序列表中启动 PuTTY。

1. 如有必要，在 **Category (类别)** 列表中，选择 **Session (会话)**。

1. 在**主机名（或 IP 地址）**中，键入`hadoop@`*MasterPublicDNS*。例如：`hadoop@`*ec2-\$1\$1\$1-\$1\$1-\$1\$1-\$1\$1\$1.compute-1.amazonaws.com*。

1. 在 **类别 (Category)** 列表中，选择 **Connection (连接) > SSH**, **Auth** (SSH,身份验证)。

1. 对于 **Private key file for authentication (用于身份验证的私有密钥文件)**，选择 **Browse (浏览)**，然后选择您生成的 `.ppk` 文件。

1. 依次选择 **Open (打开)**、**Yes (是)** 以取消 PuTTY 安全警告。
**重要**  
登录主节点时，如果系统提示您输入用户名，请键入 `hadoop`。

1. 完成主节点上的工作以后，您可以关闭 PuTTY，从而关闭 SSH 连接。
**注意**  
为了防止 SSH 连接超时，您可以在 **Category (类别)** 列表中选择 **Connection (连接)**，然后选择 **Enable TCP\$1keepalives (启用 TCP\$1keepalives)** 选项。如果在 PuTTY 中有活动的 SSH 会话，则可以通过打开 PuTTY 标题栏的上下文（右键单击）菜单，然后选择 **Change Settings (更改设置)** 来更改设置。

如果您在使用 SSH 连接到主节点时遇到困难，请参阅[排查实例的连接问题](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)。

## 使用 Connect 连接到主节点 Amazon CLI


你可以在 Windows、Linux、Unix 和 Mac OS X 上使用与主节点创建 SSH 连接。无论平台如何，你都需要主节点的公有 DNS 名称和你的 Amazon EC2 密钥对私钥。 Amazon CLI 如果您在 Linux、Unix 或 Mac OS X 上使用，则还必须设置私钥（`.pem`或`.ppk`）文件的权限，如所示[配置密钥对私有密钥文件权限](#emr-keypair-file-permission-config)。 Amazon CLI <a name="emr-ssh-cli"></a>

**要使用连接到主节点 Amazon CLI**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 要检索集群标识符，请键入：

   ```
   1. aws emr list-clusters
   ```

   输出列出了您的集群，包括集群 IDs。记下您连接的集群的集群 ID。

   ```
   "Status": {
       "Timeline": {
           "ReadyDateTime": 1408040782.374,
           "CreationDateTime": 1408040501.213
       },
       "State": "WAITING",
       "StateChangeReason": {
           "Message": "Waiting after step completed"
       }
   },
   "NormalizedInstanceHours": 4,
   "Id": "j-2AL4XXXXXX5T9",
   "Name": "AWS CLI cluster"
   ```

1. 键入以下命令以打开与主节点的 SSH 连接。在以下示例中，*j-2AL4XXXXXX5T9*替换为群集 ID，*\$1/mykeypair.key*替换为文件（对于 Linux、Unix 和 Mac OS X）或`.ppk`文件（对于 Windows）的完整路径和文件名。`.pem`例如 `C:\Users\<username>\.ssh\mykeypair.pem`。

   ```
   aws emr ssh --cluster-id j-2AL4XXXXXX5T9 --key-pair-file ~/mykeypair.key						
   ```

1. 在主节点上完成工作后，关闭 Amazon CLI 窗口。

   有关更多信息，请参阅 [Amazon CLI中的 Amazon EMR 命令](https://docs.amazonaws.cn/cli/latest/reference/emr)。如果您在使用 SSH 连接到主节点时遇到困难，请参阅[排查实例的连接问题](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html)。

# Amazon EMR 服务端口


**注意**  
以下是适用于 Amazon EMR 上的组件的接口和端口。这不是服务端口的完整列表。未列出非默认服务，例如 SSL 端口和不同类型的协议。

**重要**  
在编辑安全组规则以打开端口时要小心。请务必为运行工作负载所需的协议和端口添加仅允许来自可信和经过身份验证的客户的流量的规则。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-service-ports.html)

# 查看 Amazon EMR 集群上托管的 Web 界面


**重要**  
可以配置自定义安全组，以允许对这些 Web 界面的入站访问。请记住，您允许入站流量通过的任何端口，都代表着潜在的安全漏洞。请仔细检查自定义安全组，以确保您最大限度地减少漏洞。有关更多信息，请参阅 [使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md)。

安装在 EMR 集群上的 Hadoop 和其他应用程序会将用户界面发布为主节点上托管的网站。出于安全原因，在使用 Amazon EMR 托管的安全组时，这些网站仅在主节点的本地 Web 服务器上可用。因此，您需要连接到主节点才能查看 Web 界面。有关更多信息，请参阅 [使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md)。Hadoop 还将用户界面发布为托管在核心节点和任务节点上的网站。这些网站也仅在节点上的本地 Web 服务器上可用。

下表列出了您可以在集群实例上查看的 Web 界面。这些 Hadoop 界面在所有集群上均可用。对于主实例接口，请*master-public-dns-name*替换为 Amazon EMR 控制台中集群**摘要**选项卡上列出的**主实例公有 DNS**。对于核心实例和任务实例接口，请*coretask-public-dns-name*替换为该实例列出的**公有 DNS 名称**。要查找某一实例的**公有 DNS 名称**，请在 Amazon EMR 控制台中，从列表中选择您的集群，选择**硬件**选项卡，选择包含要连接实例的实例组的 **ID**，然后记下为该实例列出的**公有 DNS 名称**。


|  界面名称 |   URI  | 
| --- | --- | 
| Fink 历史记录服务器（EMR 版本 5.33 及更高版本） | http: //: 8082/ master-public-dns-name | 
| Ganglia | http: ///gangliamaster-public-dns-name/ | 
| Hadoop HDFS（6.x 之前的 NameNode EMR 版本） | http: //: 50070/ master-public-dns-name | 
| Hadoop HDFS（6.x 之前的 NameNode EMR 版本） | https: //: 50470/ master-public-dns-name | 
| Hadoop HDFS（ NameNode EMR 版本 6.x） | http: //: 9870/ master-public-dns-name | 
| Hadoop HDFS（ NameNode EMR 版本 6.x） | https: //: 9871/ master-public-dns-name | 
| Hadoop HDFS（6.x 之前的 DataNode EMR 版本） | http: //: 50075/ coretask-public-dns-name | 
| Hadoop HDFS（6.x 之前的 DataNode EMR 版本） | https: //: 50475/ coretask-public-dns-name | 
| Hadoop HDFS（ DataNodeEMR 版本 6.x） | http: //: 9864/ coretask-public-dns-name | 
| Hadoop HDFS（ DataNode EMR 版本 6.x） | https: //: 9865/ coretask-public-dns-name | 
| HBase | http: //: 16010/ master-public-dns-name | 
| Hue | http: //: 8888/ master-public-dns-name | 
| JupyterHub | https: //: 9443/ master-public-dns-name | 
| Livy | http: //: 8998/ master-public-dns-name | 
| 火花 HistoryServer | http: //: 18080/ master-public-dns-name | 
| Tez | http: //: 8080/ master-public-dns-name tez-ui | 
| 纱线 NodeManager | http: //: 8042/ coretask-public-dns-name | 
| 纱线 ResourceManager | http: //: 8088/ master-public-dns-name | 
| Zeppelin | http: //: 8890/ master-public-dns-name | 

由于主节点上有几个特定于应用程序的界面在核心节点和任务节点上不可用，所以本文档中的说明特定于 Amazon EMR 主节点。访问核心节点和任务节点上 Web 界面的方式与访问主节点上 Web 界面的方式相同。

您可以通过多种方式访问主节点上的 Web 界面。最简单快捷的方法，就是使用 SSH 连接到主节点，并使用基于文本的浏览器 Lynx 在 SSH 客户端中查看网站。但是，Lynx 是一个基于文本的浏览器，用户界面有限，无法显示图形。以下示例说明如何使用 Lynx 打开 Hadoop ResourceManager 界面（使用 SSH 登录主节点时还会提供 Lynx URLs ）。

```
lynx http://ip-###-##-##-###.us-west-2.compute.internal:8088/
```

还有两个其他选项可用于访问提供完整浏览器功能的主节点上的 Web 界面。选择下列选项之一：
+ 选项 1（推荐用于更多技术用户）：使用 SSH 客户端连接到主节点，使用本地端口转发配置 SSH 隧道，并使用互联网浏览器打开主节点上托管的 Web 界面。此方法允许您在不使用 SOCKS 代理的情况下配置 Web 界面访问。
+ 选项 2（建议新用户使用）：使用 SSH 客户端连接到主节点，使用动态端口转发配置 SSH 隧道，并将您的互联网浏览器配置 FoxyProxy 为使用插件（例如 Firefox 或 SwitchyOmega Chrome）来管理您的 SOCKS 代理设置。此方法允许您 URLs 根据文本模式自动进行筛选，并将代理设置限制为与主节点 DNS 名称形式相匹配的域名。有关如何为 Firefox 和谷歌浏览器 FoxyProxy 进行配置的更多信息，请参阅[选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站](emr-connect-master-node-proxy.md)。

**注意**  
如果您通过集群配置修改应用程序运行所在的端口，则指向该端口的超链接将不会在 Amazon EMR 控制台中更新。这是因为控制台没有读取 `server.port` 配置的功能。

使用 Amazon EMR 5.25.0 或更高版本，可以从控制台访问 Spark 历史记录服务器 UI，而无需通过 SSH 连接设置 Web 代理。有关更多信息，请参阅[一键访问持久性 Spark 历史记录服务器](https://docs.amazonaws.cn/emr/latest/ManagementGuide/app-history-spark-UI.html)。

**Topics**
+ [

# 选项 1：使用本地端口转发设置到 Amazon EMR 主节点的 SSH 隧道
](emr-ssh-tunnel-local.md)
+ [

# 选项 2，第 1 部分：使用动态端口转发设置通往主节点的 SSH 隧道
](emr-ssh-tunnel.md)
+ [

# 选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站
](emr-connect-master-node-proxy.md)

# 选项 1：使用本地端口转发设置到 Amazon EMR 主节点的 SSH 隧道


要连接到主节点上的本地 Web 服务器，您需要在计算机和主节点之间创建 SSH 隧道。这也称为*端口转发（port forwarding）*。如果您不想使用 SOCKS 代理，可以使用本地端口转发设置通往主节点的 SSH 隧道。通过本地端口转发，您可以指定未使用的本地端口，这些端口用于将流量转发到主节点本地 Web 服务器上的特定远程端口。

使用本地端口转发设置 SSH 隧道，需要主节点的公有 DNS 名称和密钥对私有密钥文件。有关如何查找主节点公有 DNS 名称的信息，请参阅[检索主节点的公有 DNS 名称](emr-connect-master-node-ssh.md#emr-connect-master-dns)。有关访问密钥对的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。有关您可能希望在主节点上查看的站点的更多信息，请参阅 [查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。

## 使用 OpenSSH 的本地端口转发，设置通往主节点的 SSH 隧道
<a name="tunnel-local-linux"></a>

**在终端中使用本地端口转发设置 SSH 隧道**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 打开终端窗口。在 Mac OS X 上，选择 **Applications (应用程序) > Utilities (实用程序) > Terminal (终端)**。在其它 Linux 发布版上，终端通常位于 **Applications (应用程序) > Accessories (附件) > Terminal (终端)**。

1. 键入以下命令在本地计算机上打开 SSH 隧道。 此示例命令通过将本地端口 8157（随机选择的未使用的本地端口）上的流量转发到主节点本地 ResourceManager Web 服务器上的端口 8088 来访问 Web 界面。 

   在命令中，*\$1/mykeypair.pem*替换为文件的`.pem`位置和文件名，*ec2-\$1\$1\$1-\$1\$1-\$1\$1-\$1\$1\$1.compute-1.amazonaws.com*替换为集群的主公有 DNS 名称。 要访问其他 Web 界面，请`8088`替换为相应的端口号。 例如，对于齐柏林飞艇`8088`接`8890`口，请替换为。

   ```
   ssh -i ~/mykeypair.pem -N -L 8157:ec2-###-##-##-###.compute-1.amazonaws.com:8088 hadoop@ec2-###-##-##-###.compute-1.amazonaws.com
   ```

   `-L` 代表使用本地端口转发，由此，您就能指定一个本地端口，用于将数据转发到主节点本地 Web 服务器上标识的远程端口。

   在您发出此命令后，终端保持打开状态并且不返回响应。 

1. 要在浏览器中打开 ResourceManager Web 界面，请在地址栏`http://localhost:8157/`中键入。

1. 如果您已完成使用主节点上的 Web 界面，请关闭终端窗口。

# 选项 2，第 1 部分：使用动态端口转发设置通往主节点的 SSH 隧道


要连接到主节点上的本地 Web 服务器，您需要在计算机和主节点之间创建 SSH 隧道。这也称为*端口转发（port forwarding）*。如果您使用动态端口转发创建 SSH 隧道，则路由到指定未使用本地端口的所有流量都将转发到主节点上的本地 Web 服务器。这将创建 SOCKS 代理。然后，您可以将您的互联网浏览器配置为使用插件，例如 FoxyProxy 或 SwitchyOmega 来管理您的 SOCKS 代理设置。

使用代理管理插件可以 URLs 根据文本模式自动进行筛选，并将代理设置限制为与主节点的公有 DNS 名称形式相匹配的域名。当您在查看主节点上托管的网站和互联网上托管的网站之间进行切换时，浏览器附加组件会自动处理打开和关闭代理的操作。

在开始之前，您需要主节点的公有 DNS 名称和密钥对私有密钥文件。有关如何查找主节点公有 DNS 名称的信息，请参阅 [检索主节点的公有 DNS 名称](emr-connect-master-node-ssh.md#emr-connect-master-dns)。有关访问密钥对的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 密钥对](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。有关您可能希望在主节点上查看的站点的更多信息，请参阅 [查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。

## 使用 OpenSSH 的动态端口转发，设置通往主节点的 SSH 隧道
<a name="emr-ssh-tunnel-unix"></a>

**通过 OpenSSH 使用动态端口转发设置 SSH 隧道**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 打开终端窗口。在 Mac OS X 上，选择 **Applications (应用程序) > Utilities (实用程序) > Terminal (终端)**。在其它 Linux 发布版上，终端通常位于 **Applications (应用程序) > Accessories (附件) > Terminal (终端)**。

1. 键入以下命令以在本地计算机上打开 SSH 隧道。*\$1/mykeypair.pem*替换为文件的`.pem`位置和文件名，*8157*替换为未使用的本地端口号，然后*ec2-\$1\$1\$1-\$1\$1-\$1\$1-\$1\$1\$1.compute-1.amazonaws.com*替换为集群的主公有 DNS 名称。

   ```
   1. ssh -i ~/mykeypair.pem -N -D 8157 hadoop@ec2-###-##-##-###.compute-1.amazonaws.com
   ```

   在您发出此命令后，终端保持打开状态并且不返回响应。
**注意**  
`-D` 表示使用动态端口转发，它允许您指定一个本地端口，用于将数据转发到主节点本地 Web 服务器上的所有远程端口。动态端口转发会创建一个本地 SOCKS 代理，侦听命令中指定的端口。

1. 隧道处于活动状态后，请为您的浏览器配置 SOCKS 代理。有关更多信息，请参阅 [选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站](emr-connect-master-node-proxy.md)。

1. 如果您已完成使用主节点上的 Web 界面，请关闭终端窗口。

## 使用动态端口转发设置 SSH 隧道 Amazon CLI


你可以在 Windows、Linux、Unix 和 Mac OS X 上使用与主节点创建 SSH 连接。如果你在 Linux、Unix 或 Mac OS X 上使用，则必须按中所示对`.pem`文件设置权限[配置密钥对私有密钥文件权限](emr-connect-master-node-ssh.md#emr-keypair-file-permission-config)。 Amazon CLI Amazon CLI 如果你在 Windows Amazon CLI 上使用，Putty 必须出现在路径环境变量中，否则你可能会收到错误，例如 Open SSH 或 Pu TTY 不可用。<a name="ssh-tunnel-cli"></a>

**要使用动态端口转发设置 SSH 隧道 Amazon CLI**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 创建与主节点的 SSH 连接，如 [使用 Connect 连接到主节点 Amazon CLI](emr-connect-master-node-ssh.md#emr-connect-cli) 所示。

1. 要检索集群标识符，请键入：

   ```
   1. aws emr list-clusters
   ```

   输出列出了您的集群，包括集群 IDs。记下您连接的集群的集群 ID。

   ```
   "Status": {
       "Timeline": {
           "ReadyDateTime": 1408040782.374,
           "CreationDateTime": 1408040501.213
       },
       "State": "WAITING",
       "StateChangeReason": {
           "Message": "Waiting after step completed"
       }
   },
   "NormalizedInstanceHours": 4,
   "Id": "j-2AL4XXXXXX5T9",
   "Name": "AWS CLI cluster"
   ```

1. 键入以下命令，以使用动态端口转发打开通往主节点的 SSH 隧道。在以下示例中，*j-2AL4XXXXXX5T9*替换为群集 ID，*\$1/mykeypair.key*替换为文件（对于 Linux、Unix 和 Mac OS X）或`.ppk`文件（对于 Windows）的位置和文件名。`.pem`

   ```
   aws emr socks --cluster-id j-2AL4XXXXXX5T9 --key-pair-file ~/mykeypair.key						
   ```
**注意**  
socks 命令会自动配置本地端口 8157 上的动态端口转发。目前，此设置无法修改。

1. 隧道处于活动状态后，请为您的浏览器配置 SOCKS 代理。有关更多信息，请参阅 [选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站](emr-connect-master-node-proxy.md)。

1. 使用完主节点上的 Web 界面后，关闭 Amazon CLI 窗口。

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

## 使用 PuTTY 设置通往主节点的 SSH 隧道


Windows 用户可以使用 SSH 客户端（如 PuTTY），创建通往主节点的 SSH 隧道。在连接到 Amazon EMR 主节点之前，您应该下载并安装 Putty 和 Pu。TTYgen可以从 [PuTTY 下载页面](http://www.chiark.greenend.org.uk/~sgtatham/putty/)下载这些工具。

PuTTY 本身不支持 Amazon EC2 生成的密钥对私有密钥文件格式（`.pem`）。您可以使用 Pu 将密钥文件TTYgen 转换为所需的 PuTTY 格式 () `.ppk`。您必须将密钥转换为此格式 (`.ppk`)，然后才能尝试使用 PuTTY 连接到主节点。

有关转换密钥的更多信息，请参阅 *Amazon EC2 用户指南TTYgen*中的[使用 Pu 转换私钥](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/putty.html)。<a name="emr-ssh-tunnel-putty"></a>

**通过 PuTTY 使用动态端口转发设置 SSH 隧道**

1. 确保您已允许入站 SSH 流量。有关说明，请参阅[连接到 Amazon EMR 之前：授权入站流量](emr-connect-ssh-prereqs.md)。

1. 双击 `putty.exe` 以启动 PuTTY。也可以从 Windows 程序列表中启动 PuTTY。
**注意**  
如果您已经有与主节点之间的活动 SSH 会话，则可以通过右键单击 PuTTY 标题栏并选择 **Change Settings**（更改设置）来添加隧道。

1. 如有必要，在 **Category (类别)** 列表中，选择 **Session (会话)**。

1. 在 “**主机名**” 字段中，键入**hadoop@***MasterPublicDNS*。例如：**hadoop@***ec2-\$1\$1\$1-\$1\$1-\$1\$1-\$1\$1\$1.compute-1.amazonaws.com*。

1. 在 **Category (类别)** 列表中，展开 **Connection (连接) > SSH**，然后选择 **Auth (身份验证)**。

1. 对于 **Private key file for authentication (用于身份验证的私有密钥文件)**，选择 **Browse (浏览)**，然后选择您生成的 `.ppk` 文件。
**注意**  
PuTTY 本身不支持 Amazon EC2 生成的密钥对私有密钥文件格式（`.pem`）。您可以使用 Pu 将密钥文件TTYgen 转换为所需的 PuTTY 格式 () `.ppk`。您必须将密钥转换为此格式 (`.ppk`)，然后才能尝试使用 PuTTY 连接到主节点。

1. 在 **Category (类别)** 列表中，展开 **Connection (连接) > SSH**，然后选择 **Tunnels (隧道)**。

1. 在 **Source port (源端口)** 字段，键入 `8157`（未使用的本地端口），然后选择 **Add (添加)**。

1. 将 **Destination (目标)** 字段留空。

1. 选择 **Dynamic (动态)** 和 **Auto (自动)** 选项。

1. 选择 **Open (打开)**。

1. 选择 **Yes (是)** 以取消 PuTTY 安全警告。
**重要**  
登录主节点时，如果系统提示您输入用户名，请键入 `hadoop`。

1. 隧道处于活动状态后，请为您的浏览器配置 SOCKS 代理。有关更多信息，请参阅 [选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站](emr-connect-master-node-proxy.md)。

1. 如果您已完成使用主节点上的 Web 界面，请关闭 PuTTY 窗口。

# 选项 2，第 2 部分：配置代理设置以查看 Amazon EMR 集群主节点上托管的网站


如果您使用带有动态端口转发的 SSH 隧道，则必须使用 SOCKS 代理管理附加组件来控制浏览器中的代理设置。使用 SOCKS 代理管理工具可以 URLs 根据文本模式自动进行筛选，并将代理设置限制为与主节点的公有 DNS 名称形式相匹配的域。当您在查看主节点上托管的网站和互联网上托管的网站之间进行切换时，浏览器附加组件会自动处理打开和关闭代理的操作。要管理您的代理设置，请将浏览器配置为使用插件，例如 FoxyProxy 或 SwitchyOmega。

有关创建 SSH 隧道的更多信息，请参阅[选项 2，第 1 部分：使用动态端口转发设置通往主节点的 SSH 隧道](emr-ssh-tunnel.md)。有关可用 Web 界面的更多信息，请参阅[查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。



在设置代理附加组件时，请包括以下设置：
+ 使用 **localhost** 作为主机地址。
+ 使用您选择的相同本地端口号与 [选项 2，第 1 部分：使用动态端口转发设置通往主节点的 SSH 隧道](emr-ssh-tunnel.md) 中的主节点建立 SSH 隧道。例如，端口*8157*。此端口还必须与您在 PuTTY 或用于连接的任何其它终端仿真器中使用的端口号相匹配。
+ 指定 **SOCKS v5** 协议。SOCKS v5 允许您有选择地设置用户授权。
+ **URL 模式**

  以下 URL 模式应列入允许列表并使用通配符模式类型指定：
  + **\$1ec2\$1.\$1compute\$1.amazonaws.com\$1** 和 **\$110\$1.amazonaws.com\$1** 模式与美国区域中集群的公有 DNS 名称匹配。
  + **\$1ec2\$1.compute\$1** 和 **\$110\$1.compute\$1** 模式与所有其它区域中集群的公有 DNS 名称匹配。
  +  A **10。 **\$1 模式用于提供对 Hadoop 中JobTracker 日志文件的访问权限。如果此筛选条件与您的网络访问计划冲突，请更改此筛选条件。
  + **\$1.ec2.internal\$1** 和 **\$1.compute.internal\$1** 模式，分别与 `us-east-1` 区域和所有其它区域中集群的私有（内部）DNS 名称相匹配。

## 示例：为 Firefox FoxyProxy 进行配置


以下示例演示了 Mozilla Firefox 的 FoxyProxy 标准（版本 7.5.1）配置。

FoxyProxy 提供了一组代理管理工具。该工具有便于您将代理服务器用于 URL，这些 URL 与 Amazon EMR 集群中 Amazon EC2 实例所使用的域对应模式相匹配。<a name="foxy-proxy"></a>

**FoxyProxy 使用 Mozilla Firefox 进行安装和配置**

1. 在 Firefox 中，前往 [https://addons.mozilla.org/](https://addons.mozilla.org/) 搜索 FoxyProxy Standard，然后按照说明添加 FoxyProxy 到 Firefox。

1. 使用文本编辑器，根据以下示例配置创建名为 `foxyproxy-settings.json` 的 JSON 文件。

   ```
   {
     "k20d21508277536715": {
       "active": true,
       "address": "localhost",
       "port": 8157,
       "username": "",
       "password": "",
       "type": 3,
       "proxyDNS": true,
       "title": "emr-socks-proxy",
       "color": "#0055E5",
       "index": 9007199254740991,
       "whitePatterns": [
         {
           "title": "*ec2*.*compute*.amazonaws.com*",
           "active": true,
           "pattern": "*ec2*.*compute*.amazonaws.com*",
           "importedPattern": "*ec2*.*compute*.amazonaws.com*",
           "type": 1,
           "protocols": 1
         },
         {
           "title": "*ec2*.compute*",
           "active": true,
           "pattern": "*ec2*.compute*",
           "importedPattern": "*ec2*.compute*",
           "type": 1,
           "protocols": 1
         },
         {
           "title": "10.*",
           "active": true,
           "pattern": "10.*",
           "importedPattern": "http://10.*",
           "type": 1,
           "protocols": 2
         },
         {
           "title": "*10*.amazonaws.com*",
           "active": true,
           "pattern": "*10*.amazonaws.com*",
           "importedPattern": "*10*.amazonaws.com*",
           "type": 1,
           "protocols": 1
         },
         {
           "title": "*10*.compute*",
           "active": true,
           "pattern": "*10*.compute*",
           "importedPattern": "*10*.compute*",
           "type": 1,
           "protocols": 1
         },
         {
           "title": "*.compute.internal*",
           "active": true,
           "pattern": "*.compute.internal*",
           "importedPattern": "*.compute.internal*",
           "type": 1,
           "protocols": 1
         },
         {
           "title": "*.ec2.internal* ",
           "active": true,
           "pattern": "*.ec2.internal*",
           "importedPattern": "*.ec2.internal*",
           "type": 1,
           "protocols": 1
         }
       ],
       "blackPatterns": []
     },
     "logging": {
       "size": 100,
       "active": false
     },
     "mode": "patterns",
     "browserVersion": "68.12.0",
     "foxyProxyVersion": "7.5.1",
     "foxyProxyEdition": "standard"
   }
   ```

1. 打开 Firefox **Manage Your Extensions (管理您的扩展)** 页面（转到 **about:addons**，然后选择 **Extensions (扩展)**）。

1. 选择 “**FoxyProxy 标准**”，然后选择 “更多选项” 按钮（看起来像省略号的按钮）。

1. 从下拉列表中选择 **Options (选项)**。

1. 从左侧菜单中选择 **Import Settings (导入设置)**。

1. ****在 **“导入设置”** 页面上，在 ** FoxyProxy 6.0\$1 版本的 “导入设置”** 下选择 “导入设置”，浏览到您创建`foxyproxy-settings.json`的文件的位置，选择该文件，然后选择 “打开”。****

1. 当系统提示覆盖现有设置并保存新配置时，选择 **OK (确定)**。

## 示例：为 chrome SwitchyOmega 进行配置


以下示例演示了如何为谷歌浏览器设置 SwitchyOmega扩展程序。 SwitchyOmega 允许您配置、管理和在多个代理之间切换。

**SwitchyOmega 使用谷歌浏览器进行安装和配置**

1. 前往[https://chrome.google.com/webstore/类别/扩展程序](https://chrome.google.com/webstore/category/extensions)，搜索**代理 SwitchyOmega**，然后将其添加到 Chrome。

1. 选择 **New profile (新建配置文件)** 并输入 `emr-socks-proxy` 作为配置文件名称。

1. 选择 **PAC profile (PAC 配置文件)** 然后选择 **Create (创建)**。[代理自动配置 (PAC)](https://developer.mozilla.org/en-US/docs/Web/HTTP/Proxy_servers_and_tunneling/Proxy_Auto-Configuration_(PAC)_file) 文件，可帮助您定义应转发到 Web 代理服务器的浏览器请求的允许列表。

1. 在 **PAC 脚本**字段中，将内容替换为以下脚本，该脚本定义了 URLs 应通过 Web 代理服务器转发哪些脚本。如果您在设置 SSH 隧道时指定了不同的端口号，请将其*8157*替换为您的端口号。

   ```
   function FindProxyForURL(url, host) {
       if (shExpMatch(url, "*ec2*.*compute*.amazonaws.com*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "*ec2*.compute*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "http://10.*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "*10*.compute*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "*10*.amazonaws.com*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "*.compute.internal*")) return 'SOCKS5 localhost:8157';
       if (shExpMatch(url, "*ec2.internal*")) return 'SOCKS5 localhost:8157';
       return 'DIRECT';
   }
   ```

1. 在 **Actions (操作)** 下，选择 **Apply changes (应用更改)** 以保存您的代理设置。

1. 在 Chrome 工具栏上，选择 SwitchyOmega 并选择`emr-socks-proxy`配置文件。

## 访问浏览器中的 Web 界面


要打开 Web 界面，请在浏览器地址栏中输入主节点或核心节点的公有 DNS 名称，后跟所选界面的端口号。以下示例显示了您为连接到 Spark 而需要输入的网址 HistoryServer。

```
http://master-public-dns-name:18080/				
```

有关检索节点的公有 DNS 名称的说明，请参阅[检索主节点的公有 DNS 名称](emr-connect-master-node-ssh.md#emr-connect-master-dns)。有关 Web 界面的完整列表 URLs，请参阅[查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。

# 将工作提交到 Amazon EMR 集群


此部分描述您可用于向 Amazon EMR 集群提交工作的方法。您可以通过添加步骤或以交互方式向主节点提交 Hadoop 任务的形式向集群提交工作。

向集群提交步骤时，请考虑以下步骤行为规则：
+ 步骤 ID 最多可包含 256 个字符。
+ 一个集群中最多可以有 256 个待处理和正在运行的步骤。
+ 即使集群上运行有 256 个活动步骤，您可以采用交互方式向主节点提交任务。您可以在长时间运行的集群的生命周期内提交不限数量的步骤，但是，在给定时间只能有 256 个步骤处于 RUNNING 或 PENDING 状态。
+ 对于 Amazon EMR 版本 4.8.0 和更高版本（版本 5.0.0 除外），您可以取消待处理步骤。有关更多信息，请参阅 [将工作提交到 Amazon EMR 集群时取消步骤](emr-cancel-steps.md)。
+ 使用 Amazon EMR 版本 5.28.0 和更高版本，可以取消待处理步骤和正在运行的步骤。您还可以选择并行运行多个步骤以提高集群利用率并节省成本。有关更多信息，请参阅 [向 Amazon EMR 提交工作时并行运行多个步骤的注意事项](emr-concurrent-steps.md)。

**注意**  
为了获得最佳性能，我们建议您将要用于 Amazon EMR 的自定义引导操作、脚本和其他文件存储在与您的集群 Amazon Web Services 区域 相同的 Amazon S3 存储桶中。

**Topics**
+ [

# 使用 Amazon EMR 管理控制台向集群添加步骤
](emr-add-steps-console.md)
+ [

# 使用向 Amazon EMR 集群添加步骤 Amazon CLI
](add-step-cli.md)
+ [

# 向 Amazon EMR 提交工作时并行运行多个步骤的注意事项
](emr-concurrent-steps.md)
+ [

# 查看将工作提交到 Amazon EMR 集群后的步骤
](emr-view-steps.md)
+ [

# 将工作提交到 Amazon EMR 集群时取消步骤
](emr-cancel-steps.md)

# 使用 Amazon EMR 管理控制台向集群添加步骤
使用控制台添加步骤

在 Amazon Web Services 管理控制台中，请按照以下操作步骤将步骤添加到集群中。有关如何为特定大数据应用程序提交步骤的详细信息，请参阅 [Amazon EMR Release Guide](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-release-components.html)**：
+ [提交自定义 JAR 步骤](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-launch-custom-jar-cli.html) 
+ [提交 Hadoop 流式传输步骤](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/CLI_CreateStreaming.html) 
+ [提交 Spark 步骤](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-spark-submit-step.html) 
+ [提交 Pig 步骤](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-pig-launch.html#ConsoleCreatingaPigJob) 
+ [将命令或脚本作为步骤运行](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-launch-custom-jar-cli.html) 
+ [将值传递到运行 Hive 脚本的步骤中](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-hive-differences.html#emr-hive-additional-features) 

## 在创建集群过程中添加步骤
创建集群过程中

从中 Amazon Web Services 管理控制台，您可以在创建集群时添加步骤。

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

**使用控制台创建集群时添加步骤**

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

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

1. 在 **Steps**（步骤）下，选择 **Add step**（添加步骤）。在 **Add Step**（添加步骤）对话框的字段中输入相应值。有关格式化步骤参数的信息，请参阅 [添加步骤参数](#emr-add-steps-console-arguments)。选项因步骤类型而异。要添加步骤并退出对话框，请选择**添加步骤**。

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

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

------

## 向正在运行的集群添加步骤
正在运行的集群

使用 Amazon Web Services 管理控制台，您可以在禁用自动终止选项的情况下向集群添加步骤。

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

**使用控制台向正在运行的集群添加步骤**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，选择 **Add step**（添加步骤）。要克隆现有步骤，请选择 **Actions**（操作）下拉菜单，然后选择 **Clone step**（克隆步骤）。

1. 在 **Add Step**（添加步骤）对话框的字段中输入相应值。选项因步骤类型而异。要添加步骤并退出对话框，请选择 **Add step**（添加步骤）。

------

## 修改正在运行的集群中的步骤并发级别
修改步骤并发

使用 Amazon Web Services 管理控制台，您可以修改正在运行的集群中的步骤并发级别。

**注意**  
您只能使用 Amazon EMR 版本 5.28.0 和更高版本并行运行多个步骤。

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

**使用控制台修改正在运行的集群中的步骤并发性**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。集群必须处于运行状态才能更改其并发属性。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，找到 **Attributes**（属性）部分。选择 **Edit**（编辑）以更改并发级别。请输入 1 到 256 之间的值。

------

## 添加步骤参数


使用 Amazon Web Services 管理控制台 向集群添加步骤时，可以在 “参数” 字段中为该步骤指定**参数**。您必须使用空格、字符组成的两边字符串参数*以及*带引号的空格分隔参数。

**Example ：参数正确**  
以下示例参数的格式正确 Amazon Web Services 管理控制台，最后一个字符串参数前后加了引号。  

```
bash -c "aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh ."
```
您还可以为了实现可读性，将每个参数放在单独的行中，如下面的示例所示。  

```
bash 
-c 
"aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh ."
```

**Example ：参数不正确**  
以下示例参数的格式不正确，不适用于 Amazon Web Services 管理控制台。请注意，最后一个字符串参数 `aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh .` 含有空格，没有引号。  

```
bash -c aws s3 cp s3://amzn-s3-demo-bucket/my-script.sh .
```

# 使用向 Amazon EMR 集群添加步骤 Amazon CLI
使用 CLI 添加步骤

以下过程演示如何使用 Amazon CLI向新创建的集群和正在运行的集群添加步骤。两个示例都使用 `--steps` 子命令向集群添加步骤。

**在集群创建过程中添加步骤**
+ 键入以下命令以创建集群并添加一个 Apache Pig 步骤。确保将 *`myKey`* 替换为您的 Amazon EC2 密钥对的名称。

  ```
  1. aws emr create-cluster --name "Test cluster" \
  2. --applications Name=Spark \
  3. --use-default-roles \
  4. --ec2-attributes KeyName=myKey \
  5. --instance-groups InstanceGroupType=PRIMARY,InstanceCount=1,InstanceType=m5.xlarge InstanceGroupType=CORE,InstanceCount=2,InstanceType=m5.xlarge \
  6. --steps '[{"Args":["spark-submit","--deploy-mode","cluster","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","5"],"Type":"CUSTOM_JAR","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Name":"Spark application"}]'
  ```
**注意**  
参数列表因步骤类型而异。

  默认情况下，步骤并发级别为 `1`。您可以在创建集群时使用 `StepConcurrencyLevel` 参数设置步骤并发级别。

  输出是类似于以下内容的集群标识符。

  ```
  1. {
  2.     "ClusterId": "j-2AXXXXXXGAPLF"
  3. }
  ```

**向正在运行的集群添加步骤**
+ 键入以下命令以向正在运行的集群添加步骤。使用您自己的集群 ID 替换 `j-2AXXXXXXGAPLF`。

  ```
  aws emr add-steps --cluster-id j-2AXXXXXXGAPLF \
  --steps '[{"Args":["spark-submit","--deploy-mode","cluster","--class","org.apache.spark.examples.SparkPi","/usr/lib/spark/examples/jars/spark-examples.jar","5"],"Type":"CUSTOM_JAR","ActionOnFailure":"CONTINUE","Jar":"command-runner.jar","Properties":"","Name":"Spark application"}]'
  ```

   输出是类似于以下内容的步骤标识符。

  ```
  1. {
  2.     "StepIds": [
  3. 	"s-Y9XXXXXXAPMD"
  4.     ]
  5. }
  ```

**在正在运行的集群 StepConcurrencyLevel 中修改**

1. 在正在运行的集群中，您可以使用 `ModifyCluster` API 修改 `StepConcurrencyLevel`。例如，键入以下命令将 `StepConcurrencyLevel` 增加到 `10`。使用您的集群 ID 替换 `j-2AXXXXXXGAPLF`。

   ```
   aws emr modify-cluster --cluster-id j-2AXXXXXXGAPLF --step-concurrency-level 10
   ```

1. 输出类似于以下内容。

   ```
   {
   "StepConcurrencyLevel": 10
   }
   ```

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

# 向 Amazon EMR 提交工作时并行运行多个步骤的注意事项
运行多个步骤

向 Amazon EMR 提交工作时，并行运行多个步骤需要对资源规划和集群行为预期做出初步决定。这里详细介绍了这些内容。
+ 并行运行的步骤可以按任何顺序完成，但队列中的待处理步骤要按照它们提交的顺序转换为运行状态。
+ 为集群选择步骤并发级别时，必须考虑主节点实例类型是否满足用户工作负载的内存要求。主步骤执行程序进程在每个步骤的主节点上运行。与一次运行一个步骤相比，并行运行多个步骤要求主节点拥有更多的内存和更高的 CPU 利用率。
+ 要对并发步骤实现复杂的计划和资源管理，您可以使用 YARN 计划功能（如 `FairScheduler` 或 `CapacityScheduler`）。例如，您可以将 `FairScheduler` 与 `queueMaxAppsDefault` 集合一起使用，以防止一次运行超过特定数量的作业。
+ 步骤并发级别取决于资源管理器的配置。例如，如果 YARN 配置的并行度仅为 `5`，则即使 `StepConcurrencyLevel` 设置为 `10`，您也只能让五个 YARN 应用程序并行运行。有关配置资源管理器的更多信息，请参阅《Amazon EMR 版本指南**》中的[配置应用程序](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-configure-apps.html)。
+ 当集群的步骤并发级别大于 1 时，不能添加具有 `ActionOnFailure`（CONTINUE 除外）的步骤。
+ 如果集群的步骤并发级别大于 1，步骤 `ActionOnFailure` 功能将不会激活。
+ 如果集群的步骤并发级别为 `1` 但有多个运行步骤，则 `TERMINATE_CLUSTER ActionOnFailure` 可能会激活，但 `CANCEL_AND_WAIT ActionOnFailure` 不会。当集群步骤并发级别大于一时会出现这种边缘情况，但在运行多个步骤时会减少发生该情况。
+ 使用 EMR 自动扩展可以基于 YARN 资源向上和向下扩展，以防止资源争用。有关更多信息，请参阅《[Amazon EMR 管理指南](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-automatic-scaling.html)》中的*将自动伸缩与实例组的自定义策略结合使用*。
+ 当您降低步骤并发级别时，EMR 允许在减少步骤数之前完成任何正在运行的步骤。如果资源因集群运行的并发步骤太多而耗尽，我们建议手动取消所有正在运行的步骤以释放资源。

# 查看将工作提交到 Amazon EMR 集群后的步骤


您最多可以看到 Amazon EMR 在过去七天内完成的 10000 个步骤。您还可以随时查看 Amazon EMR 完成的 1000 个步骤。此总数包括用户提交的步骤和系统步骤。

如果您在集群达到 1000 个步骤记录限制后提交新的步骤，Amazon EMR 将删除状态为“已完成”、“已取消”或“失败”超过 7 天的非活动用户提交的步骤。如果您提交的步骤超出 10000 个步骤记录限制，Amazon EMR 会删除用户提交的非活动步骤记录，无论其非活动持续时间长短。Amazon EMR 不会从日志文件中删除这些记录。Amazon EMR 会将它们从 Amazon 控制台中删除，当您使用 Amazon CLI 或 API 检索集群信息时，它们不会被返回。任何时候都不会删除系统步骤记录。

可以查看的步骤信息取决于用于检索集群信息的机制。下表显示每个可用选项所返回的步骤信息。

 


| Option | DescribeJobFlow 或者--描述--jobflow | ListSteps 或列表步骤 | 
| --- | --- | --- | 
| SDK | 256 个步骤 | 最多 10000 个步骤 | 
| Amazon EMR CLI | 256 个步骤 | NA | 
| Amazon CLI | NA | 最多 10000 个步骤 | 
| API | 256 个步骤 | 最多 10000 个步骤 | 

# 将工作提交到 Amazon EMR 集群时取消步骤


向集群提交工作时，您可以从 Amazon Web Services 管理控制台 Amazon CLI、或 Amazon EMR 中取消待处理和正在运行的步骤。API。

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

**使用控制台取消步骤**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。

1. 在集群详细信息页面的 **Steps**（步骤）选项卡上，选中要取消的步骤旁边的复选框。选择 **Actions**（操作）下拉菜单，然后选择 **Cancel steps**（取消步骤）。

1. 在 **Cancel the step**（取消步骤）对话框中，选择取消步骤并等待退出，或者取消步骤并强制退出。然后，选择 **Confirm（确认）**。

1. **Steps**（步骤）表中的步骤状态更改为 `CANCELLED`。

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

**要使用取消订阅 Amazon CLI**
+ 使用 `aws emr cancel-steps` 命令指定集群和要取消的步骤。以下示例演示了用于取消两个步骤的 Amazon CLI 命令。

  ```
  aws emr cancel-steps --cluster-id j-2QUAXXXXXXXXX \
  --step-ids s-3M8DXXXXXXXXX s-3M8DXXXXXXXXX \
  --step-cancellation-option SEND_INTERRUPT
  ```

使用 Amazon EMR 版本 5.28.0，可以在取消步骤时选择以下两个取消选项之一作为 `StepCancellationOption` 参数。
+ `SEND_INTERRUPT`：这是默认选项。当收到步骤取消请求时，EMR 会向步骤发送 `SIGTERM` 信号。将 `SIGTERM` 信号处理程序添加到您的步骤逻辑，以捕获此信号并终止子步骤进程，或等待它们完成处理。
+ `TERMINATE_PROCESS`：选择此选项后，EMR 会向步骤及其所有子进程发送 `SIGKILL` 信号，然后这些进程会立即终止。

------

**取消步骤的注意事项**
+ 取消正在运行的步骤或待处理步骤将从活动步骤计数中删除该步骤。
+ 假设没有更改 `stepConcurrencyLevel`，取消正在运行的步骤并不允许待处理步骤开始运行。
+ 取消正在运行的步骤不会触发步骤 `ActionOnFailure`。
+ 对于 EMR 5.32.0 及更高版本，`SEND_INTERRUPT StepCancellationOption` 会向步骤子进程发送 `SIGTERM` 信号。您应该注意此信号并正常进行清除和关闭。`TERMINATE_PROCESS StepCancellationOption` 向步骤子进程及其所有后代进程发送 `SIGKILL` 信号；但是，异步进程不受影响。

# 在 Amazon EMR 集群执行工作时查看和监控


Amazon EMR 提供多种工具，供您收集集群信息。您可以从控制台、CLI 或者以编程的方式访问有关集群的信息。主节点上提供标准的 Hadoop Web 界面和日志文件。您还可以使用监控服务（例如 CloudWatch 和 Ganglia）来跟踪集群的性能。

从 Amazon EMR 5.25.0 开始，也可以使用适用 UIs 于 Spark History Server 的 “持久” 应用程序从控制台获取应用程序历史记录。借助 Amazon EMR 6.x，持久性 YARN 时间线服务器和 Tez 用户界面也可用。这些服务是在集群外托管的，因此您可以在集群终止后的 30 天内访问应用程序历史记录，而无需 SSH 连接或 Web 代理。请参阅[查看应用程序历史记录](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-cluster-application-history.html)。

**Topics**
+ [

# 查看 Amazon EMR 集群状态和详细信息
](emr-manage-view-clusters.md)
+ [

# 使用 Amazon EMR 增强步骤调试
](emr-enhanced-step-debugging.md)
+ [

# 查看 Amazon EMR 应用程序历史记录
](emr-cluster-application-history.md)
+ [

# 查看 Amazon EMR 日志文件
](emr-manage-view-web-log-files.md)
+ [

# 查看 Amazon EC2 中的集群实例
](UsingEMR_Tagging.md)
+ [

# CloudWatch 来自 Amazon EMR 的事件和指标
](emr-manage-cluster-cloudwatch.md)
+ [

# 将 Ganglia 与 Amazon EMR 结合使用查看集群应用程序指标
](ViewingGangliaMetrics.md)
+ [

# 使用记录 Amazon EMR API 调用 Amazon CloudTrail
](logging-using-cloudtrail.md)
+ [

# EMR Observability 最佳实践
](emr-metrics-observability.md)

# 查看 Amazon EMR 集群状态和详细信息


创建集群后，您可以监控其状态和获取有关其执行和可能发生的错误的详细信息 (即使在集群终止后也是如此)。Amazon EMR 会将有关已终止集群的元数据保存两个月，供您参考，之后元数据将被删除。虽然您无法从集群历史记录中删除集群，但借助 Amazon Web Services 管理控制台，您可使用 **Filter (筛选条件)** 来聚焦您关注的集群，而借助 Amazon CLI，您可使用选项与 `list-clusters` 命令来聚焦您关注的集群。

无论集群是在运行中还是已终止，您都可以访问从开始记录集群的一周内存储在集群中的应用程序历史记录。此外，在集群终止后，持久性应用程序用户界面会在集群外存储应用程序历史记录达 30 天。请参阅[查看应用程序历史记录](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-cluster-application-history.html)。

有关集群状态 [例如“Waiting (正在等待)”和“Running (正在运行)”] 的更多信息，请参阅[了解集群的生命周期](emr-overview.md#emr-overview-cluster-lifecycle)。

## 使用查看集群详细信息 Amazon Web Services 管理控制台


[https://console.aws.amazon.com/emr](https://console.amazonaws.cn/emr) 中的**集群**列表列出了您的账户和 Amazon 区域中的所有集群，包括已终止的集群。该列表显示了每个集群的以下信息：**名称**和 **ID**、**状态**和**状态详细信息**、**创建时间**、集群已运行的**已用时间**，以及集群中所有 EC2 实例累计的**标准实例小时数**。该列表是监控您的集群状态的起点，它旨在使您能够深入了解每个集群的详细信息以进行分析和故障排除。

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

**使用控制台查看集群信息**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要查看的集群。

1. 使用 **Summary**（摘要）面板查看集群配置的基本信息，例如集群状态、Amazon EMR 在集群上安装的开源应用程序以及您用于创建集群的 Amazon EMR 版本。使用“摘要”下的各个选项卡查看信息，如下表所述。

------

## 使用查看集群详细信息 Amazon CLI


以下示例说明如何使用 Amazon CLI检索集群详细信息。有关可用命令的更多信息，请参阅 [Amazon EMR 的Amazon CLI 命令参考](https://docs.amazonaws.cn/cli/latest/reference/emr)。您可以使用 [describe-cluster](https://docs.amazonaws.cn/cli/latest/reference/emr/describe-cluster.html) 命令查看集群级别详细信息，包括状态、硬件和软件配置、VPC 设置、引导操作、实例组等。有关集群状态的更多信息，请参阅[了解集群的生命周期](emr-overview.md#emr-overview-cluster-lifecycle)。以下示例演示了使用 `describe-cluster` 命令的情景，并随后提供了 [list-clusters](https://docs.amazonaws.cn/cli/latest/reference/emr/describe-cluster.html) 命令的示例。

**Example 查看集群状态**  
要使用 `describe-cluster` 命令，需要集群 ID。此示例演示了使用获取在特定日期范围内创建的集群的列表，然后使用 IDs 返回的集群之一来列出有关单个集群状态的更多信息。  
以下命令描述了集群*j-1K48XXXXXXHCB*，您可以将其替换为集群 ID。  

```
aws emr describe-cluster --cluster-id j-1K48XXXXXXHCB
```
您的命令的输出与以下内容类似：  

```
{
    "Cluster": {
        "Status": {
            "Timeline": {
                "ReadyDateTime": 1438281058.061, 
                "CreationDateTime": 1438280702.498
            }, 
            "State": "WAITING", 
            "StateChangeReason": {
                "Message": "Waiting for steps to run"
            }
        }, 
        "Ec2InstanceAttributes": {
            "EmrManagedMasterSecurityGroup": "sg-cXXXXX0", 
            "IamInstanceProfile": "EMR_EC2_DefaultRole", 
            "Ec2KeyName": "myKey", 
            "Ec2AvailabilityZone": "us-east-1c", 
            "EmrManagedSlaveSecurityGroup": "sg-example"
        }, 
        "Name": "Development Cluster", 
        "ServiceRole": "EMR_DefaultRole", 
        "Tags": [], 
        "TerminationProtected": false, 
        "ReleaseLabel": "emr-4.0.0", 
        "NormalizedInstanceHours": 16, 
        "InstanceGroups": [
            {
                "RequestedInstanceCount": 1, 
                "Status": {
                    "Timeline": {
                        "ReadyDateTime": 1438281058.101, 
                        "CreationDateTime": 1438280702.499
                    }, 
                    "State": "RUNNING", 
                    "StateChangeReason": {
                        "Message": ""
                    }
                }, 
                "Name": "CORE", 
                "InstanceGroupType": "CORE", 
                "Id": "ig-2EEXAMPLEXXP", 
                "Configurations": [], 
                "InstanceType": "m5.xlarge", 
                "Market": "ON_DEMAND", 
                "RunningInstanceCount": 1
            }, 
            {
                "RequestedInstanceCount": 1, 
                "Status": {
                    "Timeline": {
                        "ReadyDateTime": 1438281023.879, 
                        "CreationDateTime": 1438280702.499
                    }, 
                    "State": "RUNNING", 
                    "StateChangeReason": {
                        "Message": ""
                    }
                }, 
                "Name": "MASTER", 
                "InstanceGroupType": "MASTER", 
                "Id": "ig-2A1234567XP", 
                "Configurations": [], 
                "InstanceType": "m5.xlarge", 
                "Market": "ON_DEMAND", 
                "RunningInstanceCount": 1
            }
        ], 
        "Applications": [
            {
                "Version": "1.0.0", 
                "Name": "Hive"
            }, 
            {
                "Version": "2.6.0", 
                "Name": "Hadoop"
            }, 
            {
                "Version": "0.14.0", 
                "Name": "Pig"
            }, 
            {
                "Version": "1.4.1", 
                "Name": "Spark"
            }
        ], 
        "BootstrapActions": [], 
        "MasterPublicDnsName": "ec2-X-X-X-X.compute-1.amazonaws.com", 
        "AutoTerminate": false, 
        "Id": "j-jobFlowID", 
        "Configurations": [
            {
                "Properties": {
                    "hadoop.security.groups.cache.secs": "250"
                }, 
                "Classification": "core-site"
            }, 
            {
                "Properties": {
                    "mapreduce.tasktracker.reduce.tasks.maximum": "5", 
                    "mapred.tasktracker.map.tasks.maximum": "2", 
                    "mapreduce.map.sort.spill.percent": "90"
                }, 
                "Classification": "mapred-site"
            }, 
            {
                "Properties": {
                    "hive.join.emit.interval": "1000", 
                    "hive.merge.mapfiles": "true"
                }, 
                "Classification": "hive-site"
            }
        ]
    }
}
```

**Example 按创建日期列出集群**  
要检索特定日期范围内创建的集群，请使用 `list-clusters` 命令与 `--created-after` 和 `--created-before` 参数。  
以下命令将列出在 2019 年 10 月 9 日和 2019 年 10 月 12 日之间创建的所有集群。  

```
aws emr list-clusters --created-after 2019-10-09T00:12:00 --created-before 2019-10-12T00:12:00
```

**Example 按状态列出集群**  
要按状态列出集群，使用 `list-clusters` 命令与 `--cluster-states` 参数。有效集群状态包括：STARTING、BOOTSTRAPPING、RUNNING、WAITING、TERMINATING、TERMINATED 和 TERMINATED\$1WITH\$1ERRORS。  

```
aws emr list-clusters --cluster-states TERMINATED
```
您还可使用以下快捷方式参数来列出处于指定状态的所有集群：  
+ `--active` 筛选处于 STARTING、BOOTSTRAPPING、RUNNING、WAITING 或 TERMINATING 状态的集群。
+ `--terminated` 筛选处于 TERMINATED 状态的集群。
+ `--failed` 参数筛选处于 TERMINATED\$1WITH\$1ERRORS 状态的集群。
以下命令返回相同的结果。  

```
aws emr list-clusters --cluster-states TERMINATED
```

```
aws emr list-clusters --terminated
```
有关集群状态的更多信息，请参阅[了解集群的生命周期](emr-overview.md#emr-overview-cluster-lifecycle)。

# 使用 Amazon EMR 增强步骤调试


如果 Amazon EMR 步骤失败，并且您通过 5.x 版或更高版本的 AMI 使用步骤 API 操作提交了工作，则 Amazon EMR 可以在某些情况下通过 API 确定并返回步骤失败的根本原因，以及相关日志文件的名称和部分应用程序堆栈跟踪。例如，可以确定以下失败：
+ 常见 Hadoop 错误，例如输出目录已经存在、输入内容不存在，或应用程序用尽内存。
+ Java 错误，例如用不兼容的 Java 版本编译了应用程序，或用找不到的主类运行。
+ 访问在 Amazon S3 中存储的对象时发生问题。

此信息可通过[DescribeStep](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_DescribeStep.html)和 [ListSteps](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_ListSteps.html)API 操作获得。这些操作[StepSummary](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_StepSummary.html)返回的[FailureDetails](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_FailureDetails.html)字段。要访问 FailureDetails 信息，请使用 Amazon CLI、控制台或 Amazon SDK。

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

Amazon EMR 新控制台不提供步骤调试。但是，您可以通过以下步骤查看集群终止详细信息。

**使用控制台查看失败详细信息**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要查看的集群。

1. 记下显示在集群详细信息页面上 **Summary**（摘要）部分中的 **Status**（状态）值。如果状态为 **Terminated with errors**（因错误而终止），请将鼠标悬停在文本上以查看集群失败详细信息。

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

**要查看失败详情，请使用 Amazon CLI**
+ 要获取某个步骤的失败详细信息 Amazon CLI，请使用`describe-step`命令。

  ```
  aws emr describe-step --cluster-id j-1K48XXXXXHCB --step-id s-3QM0XXXXXM1W
  ```

  输出将类似如下：

  ```
  {
    "Step": {
      "Status": {
        "FailureDetails": {
          "LogFile": "s3://amzn-s3-demo-bucket/logs/j-1K48XXXXXHCB/steps/s-3QM0XXXXXM1W/stderr.gz",
          "Message": "org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory s3://amzn-s3-demo-bucket/logs/beta already exists",
          "Reason": "Output directory already exists."
        },
        "Timeline": {
          "EndDateTime": 1469034209.143,
          "CreationDateTime": 1469033847.105,
          "StartDateTime": 1469034202.881
        },
        "State": "FAILED",
        "StateChangeReason": {}
      },
      "Config": {
        "Args": [
          "wordcount",
          "s3://amzn-s3-demo-bucket/input/input.txt",
          "s3://amzn-s3-demo-bucket/logs/beta"
        ],
        "Jar": "s3://amzn-s3-demo-bucket/jars/hadoop-mapreduce-examples-2.7.2-amzn-1.jar",
        "Properties": {}
      },
      "Id": "s-3QM0XXXXXM1W",
      "ActionOnFailure": "CONTINUE",
      "Name": "ExampleJob"
    }
  }
  ```

------

# 查看 Amazon EMR 应用程序历史记录


您可以在控制台中使用集群详细信息页面查看 Spark 历史记录服务器和 YARN 时间线服务应用程序的详细信息。Amazon EMR 应用程序历史记录可让您更轻松地对活动的任务和任务历史记录进行故障排除和分析。

**注意**  
为了增强可能与 Amazon EMR 结合使用的非控制台应用程序的安全性，应用程序托管域已在公共后缀列表（PSL）中注册。这些托管域的示例包括以下各项：`emrstudio-prod.us-east-1.amazonaws.com`、`emrnotebooks-prod.us-east-1.amazonaws.com`、`emrappui-prod.us-east-1.amazonaws.com`。为进一步增强安全性，如果您需要在默认域名中设置敏感 Cookie，我们建议您使用带 `__Host-` 前缀的 Cookie。这将有助于保护您的域，防范跨站点请求伪造（CSRF）攻击。有关更多信息，请参阅 *Mozilla 开发者网络*中的 [https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#cookie_prefixes) 页面。

**Applications**（应用程序）选项卡的 **Application user interfaces**（应用程序用户界面）部分提供多个查看选项，具体取决于集群状态和您在集群上安装的应用程序。
+ [集群外访问持久性应用程序用户界面](https://docs.amazonaws.cn/emr/latest/ManagementGuide/app-history-spark-UI.html)：从 Amazon EMR 版本 5.25.0 开始，Spark UI 和 Spark 历史记录服务器可以使用持久性应用程序用户界面链接。对于 Amazon EMR 版本 5.30.1 及更高版本，Tez UI 和 YARN 时间线服务器也具有持久性应用程序用户界面。YARN 时间线服务器和 Tez UI 是开源应用程序，可提供适用于活动的和已终止的集群的指标。Spark 用户界面提供有关计划程序阶段和任务、RDD 大小和内存使用情况的详细信息、环境信息以及有关正在运行的执行程序的信息。永久性应用程序 UIs 在集群外运行，因此集群信息和日志在应用程序终止后的 30 天内可用。与集群上的应用程序用户界面不同，永久性应用程序 UIs 不需要您通过 SSH 连接设置 Web 代理。
+ [集群上的应用程序用户界面](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-web-interfaces.html)：可以在集群上运行的应用程序历史记录用户界面各种各样。集群上的用户界面托管在主节点上，并要求您设置到 Web 服务器的 SSH 连接。应用程序终止后，集群上的应用程序用户界面将应用程序历史记录保留一周。有关设置 SSH 隧道的更多信息和说明，请参阅[查看 Amazon EMR 集群上托管的 Web 界面](emr-web-interfaces.md)。

  除了 Spark 历史记录服务器、YARN 时间线服务器和 Hive 应用程序之外，只能在集群运行时查看集群上的应用程序历史记录。

# 在 Amazon EMR 中查看持久性应用程序用户界面


从 Amazon EMR 版本 5.25.0 开始，您可以使用集群的 **Summary (摘要)** 页面或控制台中的 **Application user interfaces (应用程序用户界面)** 选项卡连接到在集群外托管的持久性 Spark 历史记录服务器应用程序的详细信息。从 Amazon EMR 版本 5.30.1 开始，提供了 Tez UI 和 YARN 时间线服务器持久性应用程序界面。对持久性应用程序历史记录的一键式链接访问提供了以下好处：
+ 您可以快速分析活动的作业和作业历史记录并进行故障排除，而无需通过 SSH 连接来设置 Web 代理。
+ 您可以访问处于活动状态和终止状态的集群的应用程序历史记录和相关日志文件。日志在应用程序结束后的 30 天内均可用。

在控制台中导航到您的集群详细信息，选择**应用程序**选项卡。集群启动后，选择您想要的应用程序 UI。应用程序 UI 将在新的浏览器选项卡中打开。有关更多信息，请参阅[监控和检测](https://spark.apache.org/docs/latest/monitoring.html)。

您可以通过 Spark 历史记录服务器、YARN 时间线服务器和 Tez UI 上的链接来查看 YARN 容器日志。

**注意**  
要从 Spark 历史记录服务器、YARN 时间线服务器和 Tez UI 访问 YARN 容器日志，您必须为集群启用 Amazon S3 日志记录。如果未启用日志记录，则指向 YARN 容器日志的链接将不起作用。

## 日志收集


要启用一键式访问持久性应用程序用户界面，Amazon EMR 需要收集两种类型的日志：
+ **应用程序事件日志** 会收集到 EMR 系统存储桶中。通过使用 Amazon S3 托管密钥的服务器端加密 (SSE-S3) 对事件日志进行静态加密。如果您为集群使用私有子网，请确保 ARNs 在私有子网的 Amazon S3 策略的资源列表中包含正确的系统存储桶。有关更多信息，请参阅[私有子网的最小 Amazon S3 策略](https://docs.amazonaws.cn/emr/latest/ManagementGuide/private-subnet-iampolicy.html)。
+ **YARN 容量日志**收集到您拥有的 Amazon S3 存储桶中。您必须为集群启用日志记录才能访问 YARN 容器日志。有关更多信息，请参阅[配置集群日志记录和调试](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-debugging.html)。

如果您出于隐私原因需要禁用此功能，则可在创建集群时使用引导脚本来停止守护程序，如以下示例所示。

```
aws emr create-cluster --name "Stop Application UI Support" --release-label emr-7.12.0 \
--applications Name=Hadoop Name=Spark --ec2-attributes KeyName=<myEMRKeyPairName> \
--instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge InstanceGroupType=CORE,InstanceCount=1,InstanceType=m3.xlarge InstanceGroupType=TASK,InstanceCount=1,InstanceType=m3.xlarge \
--use-default-roles --bootstrap-actions Path=s3://region.elasticmapreduce/bootstrap-actions/run-if,Args=["instance.isMaster=true","echo Stop Application UI | sudo tee /etc/apppusher/run-apppusher; sudo systemctl stop apppusher || exit 0"]
```

运行此引导启动脚本后，Amazon EMR 不会将任何 Spark 历史记录服务器或 YARN 时间线服务器事件日志收集到 EMR 系统存储桶中。**Application user interfaces (应用程序用户界面)** 选项卡上没有可用的应用程序历史记录信息，并且您将不再能够从控制台访问所有应用程序用户界面。

## 大型 Spark 事件日志文件


在某些情况下，长时间运行的 Spark 作业（例如 Spark 流式处理）和大型作业（例如 Spark SQL 查询）可能会生成大型事件日志。使用大型事件日志，您可以快速耗尽计算实例上的磁盘空间，并在加载 Persistent 时遇到`OutOfMemory`错误 UIs。要避免这些问题，建议您启用 Spark 事件日志滚动和压缩功能。此功能在 Amazon EMR 版本 emr-6.1.0 及更高版本上可用。有关滚动和压缩的更多详细信息，请参阅 Spark 文档中的[对滚动事件日志文件应用压缩](https://spark.apache.org/docs/latest/monitoring.html#applying-compaction-on-rolling-event-log-files)。

要激活 Spark 事件日志滚动和压缩功能，请启用以下 Spark 配置设置。
+ `spark.eventLog.rolling.enabled`：根据大小启用事件日志滚动。默认情况下，此设置处于禁用状态。
+ `spark.eventLog.rolling.maxFileSize`：激活滚动时，指定事件日志文件在滚动之前的最大大小。默认值为 128 MB。
+ `spark.history.fs.eventLog.rolling.maxFilesToRetain`：指定要保留的非压缩事件日志文件的最大数量。默认情况下，会保留所有事件日志文件。设置为较小的数字以压缩较旧的事件日志。最小值为 1。

请注意，压缩会尝试排除具有过时事件日志文件的事件，如下所示。如果它确实丢弃了事件，则在 Spark 历史记录服务器 UI 上将看不到它们。
+ 已完成作业的事件以及相关阶段或任务事件。
+ 终止执行程序的事件。
+ 已完成 SQL 查询的事件，以及相关作业、阶段和任务事件。

**启动启用滚动和压缩的集群**

1. 使用以下配置创建 `spark-configuration.json` 文件。

   ```
   [
      {
        "Classification": "spark-defaults",
           "Properties": {
              "spark.eventLog.rolling.enabled": true,
              "spark.history.fs.eventLog.rolling.maxFilesToRetain": 1
           }
      }
   ]
   ```

1. 使用 Spark 滚动压缩配置创建集群，如下所示。

   ```
   aws emr create-cluster \
   --release-label emr-6.6.0 \
   --instance-type m4.large \
   --instance-count 2 \
   --use-default-roles \
   --configurations file://spark-configuration.json
   ```

## 查看持久性应用程序用户界面的权限


以下示例展示了访问持久性应用程序用户界面所需的角色权限。对于启用了运行时角色的集群，这将仅允许用户访问由同一用户身份和运行时角色提交的应用程序。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:CreatePersistentAppUI",
        "elasticmapreduce:DescribePersistentAppUI"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:cluster/clusterId"
      ],
      "Sid": "AllowELASTICMAPREDUCECreatepersistentappui"
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:GetPersistentAppUIPresignedURL"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:*:123456789012:cluster/clusterId",
        "arn:aws:elasticmapreduce:*:123456789012:persistent-app-ui/*"
      ],
      "Condition": {
        "StringEqualsIfExists": {
          "elasticmapreduce:ExecutionRoleArn": [
            "arn:aws:iam::123456789012:role/executionRoleArn"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEGetpersistentappuipresignedurl"
    }
  ]
}
```

------

以下示例展示了针对启用了运行时角色的集群移除在持久性应用程序用户界面中查看应用程序的限制所需的角色权限。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:CreatePersistentAppUI",
        "elasticmapreduce:DescribePersistentAppUI",
        "elasticmapreduce:AccessAllEventLogs"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-XXXXXXXXXXXXX"
      ],
      "Sid": "AllowELASTICMAPREDUCECreatepersistentappui"
    },
    {
      "Effect": "Allow",
      "Action": [
        "elasticmapreduce:GetPersistentAppUIPresignedURL"
      ],
      "Resource": [
        "arn:aws:elasticmapreduce:us-east-1:123456789012:cluster/j-XXXXXXXXXXXXX",
        "arn:aws:elasticmapreduce:us-east-1:123456789012:persistent-app-ui/*"
      ],
      "Condition": {
        "StringEqualsIfExists": {
          "elasticmapreduce:ExecutionRoleArn": [
            "arn:aws:iam::123456789012:role/YourExecutionRoleName"
          ]
        }
      },
      "Sid": "AllowELASTICMAPREDUCEGetpersistentappuipresignedurl"
    }
  ]
}
```

------

## 注意事项和限制


一键式访问持久性应用程序用户界面当前具有以下限制。
+ 当应用程序详细信息显示在 Spark 历史记录服务器 UI 上时，至少会有两分钟的延迟。
+ 仅当应用程序的事件日志目录位于 HDFS 中时，此功能才起作用。默认情况下，Amazon EMR 将事件日志存储在 HDFS 的目录中。如果您将默认目录更改为其它文件系统（例如 Amazon S3），则此功能将不起作用。
+ 此功能目前不适用于具有多个主节点的 EMR 集群或与 Amazon Lake Formation集成的 EMR 集群。
+ 要启用一键式访问持久性应用程序用户界面，您必须有权对 Amazon EMR 执行 `CreatePersistentAppUI`、`DescribePersistentAppUI` 和 `GetPersistentAppUIPresignedURL` 操作。如果您拒绝 IAM 主体对这些操作的权限，则传播权限更改所需的时间大约为 5 分钟。
+ 如果某集群启用了运行时角色，则当通过 Persistent App UI 访问 Spark History Server 时，只有在运行时角色提交 Spark 作业后，用户才能访问 Spark 作业。
+ 如果某集群启用了运行时角色，则每个用户只能访问由同一用户身份和运行时角色提交的应用程序。
+  要针对启用了运行时角色的集群在持久性应用程序用户界面中查看所有应用程序，需要对 Amazon EMR 执行 `AccessAllEventLogs` 操作。
+ 如果在正在运行的集群中重新配置应用程序，则将无法通过应用程序 UI 获取应用程序历史记录。
+ 对于每个应用程序 Amazon Web Services 账户，活动应用程序的默认限制 UIs 为 200。
+ 在下文中 Amazon Web Services 区域，您可以通过 Amazon EMR 6.14.0 及更高版本 UIs 从控制台访问应用程序：
  + 亚太地区（雅加达）（ap-southeast-3）
  + 欧洲（西班牙）(eu-south-2)
  + 亚太地区（墨尔本）(ap-southeast-4)
  + 以色列（特拉维夫）（il-central-1）
  + 中东（阿联酋）(me-central-1)
+ 在下文中 Amazon Web Services 区域，您可以通过 Amazon EMR 5.25.0 及更高版本 UIs 从控制台访问应用程序：
  + 美国东部（弗吉尼亚州北部）(us-east-1)
  + 美国西部（俄勒冈州）(us-west-2)
  + 亚太地区（孟买）(ap-south-1)
  + 亚太地区（首尔）(ap-northeast-2)
  + 亚太地区（新加坡）(ap-southeast-1)
  + 亚太地区（悉尼）(ap-southeast-2)
  + 亚太地区（东京）(ap-northeast-1)
  + 加拿大（中部）(ca-central-1)
  + 南美洲（圣保罗）（sa-east-1）
  + 欧洲地区（法兰克福）(eu-central-1)
  + 欧洲地区（爱尔兰）(eu-west-1)
  + 欧洲地区（伦敦）(eu-west-2)
  + 欧洲地区（巴黎）（eu-west-3）
  + 欧洲地区（斯德哥尔摩）(eu-north-1)
  + 中国（北京）（cn-north-1）
  + 中国（宁夏）（cn-northwest-1）

# 在 Amazon EMR 中查看高级应用程序历史记录


**注意**  
建议您使用持久性应用程序界面来改善用户体验，应用程序历史记录可保留长达 30 天。此页面上描述的高级应用程序历史记录在新的 Amazon EMR 控制台 ([https://console.aws.amazon.com/](https://console.amazonaws.cn/emr)emr) 中不可用。有关更多信息，请参阅 [在 Amazon EMR 中查看持久性应用程序用户界面](app-history-spark-UI.md)。

对于 Amazon EMR 发行版 5.8.0 到 5.36.0 以及 6.8.0 或更低版本的 6.x 发行版，您可以从 Amazon EMR 旧控制台的 **Application user interfaces**（应用程序用户界面）选项卡查看高级别应用程序历史记录。在应用程序完成后，Amazon EMR **Application user interface**（应用程序用户界面）会将应用程序历史记录摘要保留七天。

## 注意事项和限制


当您使用旧版 Amazon EMR 控制台中的**应用程序用户界面**选项卡时，请注意以下限制。
+ 在使用 Amazon EMR 5.8.0 到 5.36.0 以及 6.8.0 或更低版本的 6.x 发行版时，您只能访问高级别应用程序历史记录功能。自 2023 年 1 月 23 日起，Amazon EMR 将停止所有版本的高级别应用程序历史记录。如果您使用 Amazon EMR 版本 5.25.0 或更高版本，我们建议您改用持久性应用程序用户界面。
+ 高级别应用程序历史记录功能不支持 Spark Streaming 应用程序。
+ 目前，具有多个主节点的 Amazon EMR 集群或与 Amazon Lake Formation集成的 EMR 集群不支持一键式访问持久性的应用程序用户界面。

## 示例：查看高级别应用程序历史记录


以下序列演示了如何使用旧控制台集群详细信息页面上的 **Application user interfaces**（应用程序用户界面）选项卡，通过 Spark 或 YARN 应用程序深入了解任务详细信息。

要查看集群详细信息，请从 **Clusters (集群)** 列表中选择集群 **Name (名称)**。要查看有关 YARN 容器日志的信息，您必须为集群启用日志记录。有关更多信息，请参阅[配置集群日志记录和调试](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-debugging.html)。对于 Spark 应用程序历史记录，摘要表中提供的信息只是通过 Spark 历史记录服务器 UI 提供的信息的一个子集。

在 **High-level application history (高级别应用程序历史记录)** 下的 **Application user interfaces (应用程序用户界面)** 选项卡下，您可以展开一行以显示 Spark 应用程序的诊断摘要，或选择 **Application ID (应用程序 ID)** 链接以查看有关不同应用程序的详细信息。

![\[Application user interfaces tab showing persistent and on-集群 UIs, with YARN application history.\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/app-history-app.png)


当您选择 **Application ID (应用程序 ID)** 链接时，UI 会更改以显示该应用程序的 **YARN application (YARN 应用程序)** 详细信息。在 **YARN application (YARN 应用程序)** 详细信息的 **Jobs (任务)** 选项卡中，您可以选择任务的 **Description (描述)** 链接以显示该任务的详细信息。

![\[YARN application details showing job history with completed Spark tasks and their statuses.\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/app-history-job-1.png)


在任务详细信息页面上，您可以展开有关各个任务阶段的信息，然后选择 **Description (描述)** 链接以查看阶段详细信息。

![\[EMR 集群 interface showing persistent and on-集群 application UIs, with job details and stages.\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/app-history-job-2.png)


在阶段详细信息页面上，您可以查看阶段任务和执行程序的关键指标。您还可以使用 **View logs (查看日志)** 链接查看任务和执行程序日志。

![\[Application history page showing task metrics, executor details, and log access links for a Spark job.\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/app-history-job-3.png)


# 查看 Amazon EMR 日志文件


 Amazon EMR 和 Hadoop 都可以生成日志文件，报告集群上的状态。默认情况下，这些会写入 `/mnt/var/log/` 目录中的主节点。根据您在启动时如何配置集群，这些日志还可能归档到 Amazon S3，并可通过图形调试工具进行查看。

 有多种类型的日志写入主节点。Amazon EMR 会写入步骤、引导操作和实例状态日志。Apache Hadoop 写入的日志会报告作业、任务和任务尝试的处理情况。Hadoop 还会记录守护程序的日志。[有关 Hadoop 编写的日志的更多信息，请访问 http://hadoop.apache。 org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html。](http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/ClusterSetup.html)

## 查看主节点上的日志文件


下表列出了主节点上可能显示的一些日志文件。


| 位置 | 说明 | 
| --- | --- | 
|  /emr/instance-controller/log/bootstrap-动作  | 引导操作处理期间写入的日志。 | 
|  /mnt/var/log/hadoop-state-pusher  | Hadoop 状态推送进程写入的日志。 | 
|  /emr/instance-controller/log  | 实例控制器日志。 | 
|  /emr/instance-state  | 实例状态日志。这些日志中包含有关 CPU、内存状态和节点的垃圾收集器线程的信息。 | 
|  /emr/service-nanny  | nanny 服务流程写入的日志。 | 
|  /mnt/var/log/*application*  | 特定于应用程序 (如 Hadoop、Spark 或 Hive) 的日志。 | 
|  /mnt/var/log/hadoop/steps/*N*  | 步骤日志，其中包含有关步骤处理的信息。的值*N*表示亚马逊 EMR 分配的 stepID。例如，一个集群有两个步骤：`s-1234ABCDEFGH` 和 `s-5678IJKLMNOP`。第一步位于 `/mnt/var/log/hadoop/steps/s-1234ABCDEFGH/` 中，第二步位于 `/mnt/var/log/hadoop/steps/s-5678IJKLMNOP/` 中。  Amazon EMR 写入的步骤日志如下。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)  | 

**使用 Amazon CLI查看主节点上的日志文件。**

1.  如 [使用 SSH 连接到 Amazon EMR 集群主节点](emr-connect-master-node-ssh.md) 中所述使用 SSH 连接主节点。

1.  导航到您希望查看的、包含日志文件信息的目录。上表提供了一系列可用的、用户也可以搜索到的日志文件类型。以下示例演示用于导航到 ID 为 `s-1234ABCDEFGH` 的步骤日志的命令。

   ```
   cd /mnt/var/log/hadoop/steps/s-1234ABCDEFGH/
   ```

1. 使用您选择的文件查看器来查看日志文件。以下示例使用 Linux `less` 命令查看 `controller` 日志文件。

   ```
   less controller
   ```

## 查看归档到 Amazon S3 的日志文件


默认情况下，使用控制台启动的 Amazon EMR 集群会自动将日志文件归档到 Amazon S3。您可以指定自己的日志路径，也可以允许控制台自动为您生成日志路径。对于使用 CLI 或 API 启动的集群，您必须手动配置 Amazon S3 日志归档。

 将 Amazon EMR 配置为将日志文件存档到 Amazon S3 时，它会将文件存储在您指定的 S3 位置，即/ *cluster-id* /文件夹，其中*cluster-id*是集群 ID。

下表列出了 Amazon S3 上可能显示的一些日志文件。


| 位置 | 说明 | 
| --- | --- | 
|  //node*cluster-id*/  | 节点日志，包括引导操作、实例状态和此节点的应用程序日志。每个节点的日志会存储在标有该节点的 EC2 实例标识符的文件夹中。 | 
|  //*cluster-id*node/*instance-id*/*application*  | 由每个应用程序或与应用程序关联的守护进程创建的日志。例如，Hive 服务器日志位于 `cluster-id/node/instance-id/hive/hive-server.log` 中。 | 
|  //*cluster-id*step *step-id* s//  | 步骤日志，其中包含有关步骤处理的信息。的值*step-id*表示 Amazon EMR 分配的步骤编号。例如，一个集群有两个步骤：`s-1234ABCDEFGH` 和 `s-5678IJKLMNOP`。第一步位于 `/mnt/var/log/hadoop/steps/s-1234ABCDEFGH/` 中，第二步位于 `/mnt/var/log/hadoop/steps/s-5678IJKLMNOP/` 中。  Amazon EMR 写入的步骤日志如下。 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-manage-view-web-log-files.html)  | 
|  /*cluster-id*/容器  |  应用程序容器日志。每个 YARN 应用程序的日志均存储在这些位置。  | 
|  //hadoop-mapred *cluster-id* uce/  | 包含有关配置详细信息和作业历史记录信息的日志。 MapReduce | 

**使用 Amazon S3 控制台查看存档到 Amazon S3 的日志文件**

1. 登录 Amazon Web Services 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 打开您在配置集群时指定的 S3 存储桶，以便将日志文件归档在 Amazon S3 中。

1. 导航到包含待显示信息的日志文件。上表提供了一系列可用的、用户也可以搜索到的日志文件类型。

1. 下载日志文件对象以进行查看。有关说明，请参阅[下载对象](https://docs.amazonaws.cn/AmazonS3/latest/userguide/download-objects.html)。

# 查看 Amazon EC2 中的集群实例


 为了帮助您管理资源，Amazon EC2 可让您将元数据以标签的形式分配给资源。每个 Amazon EC2 标签都包含一个密钥和一个值。标签可让您按各种标准 (例如用途、所有者或环境) 对 Amazon EC2 资源进行分类。

 您可以根据标签搜索和筛选资源。您通过 Amazon 账户为资源分配的标签仅供您使用。共享该资源的其它账户无法查看您的标签。

Amazon EMR 会自动使用键值对标记其启动的每个 EC2 实例。这些键可标识该实例所属的集群和实例组。这可以轻松地筛选要显示的 EC2 实例，例如仅显示属于特定集群的实例，或者显示目前在任务实例组中运行的全部实例。如果您同时运行多个集群，或者管理大量的 EC2 实例，这将特别有用。

这些是 Amazon EMR 分配的预定义键值对：


| 键 | 值 | 值定义 | 
| --- | --- | --- | 
| aws:elasticmapreduce:job-flow-id |  `job-flow-identifier`  | 为其预置实例的集群的 ID。它以格式 `j-XXXXXXXXXXXXX` 显示，最长可为 256 个字符。 | 
| aws:elasticmapreduce:instance-group-role |  `group-role`  | 实例组的类型，输入为以下值之一：`master`、`core`、或 `task`。 | 

 您可以对 Amazon EMR 添加的标签进行查看和筛选。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[使用标签](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/Using_Tags.html)。因为 Amazon EMR 设置的标签都属于系统标签，无法编辑也无法删除，所以有关显示和筛选标签的部分与此内容是最相关的。

**注意**  
 Amazon EMR 在 EC2 实例的状态更新为**正在运行**时为其添加标签。如果 EC2 实例的预置时间和将其状态设置为**正在运行**的时间之间发生延迟，那么 Amazon EMR 设置的标签会在实例启动后立即显示。如果您没有看到这些标签，请等待几分钟，并刷新一下视图。

# CloudWatch 来自 Amazon EMR 的事件和指标


使用事件和指标，以跟踪 Amazon EMR 集群的活动和运行状况。事件对于监控集群中的特定情况（如当集群状态从“starting (正在启动)”更改为“running (正在运行)”时）非常有用。指标对于监控特定的值（如 HDFS 在集群中使用的可用磁盘空间比例）非常有用。

有关 CloudWatch 活动的更多信息，请参阅 [Amazon CloudWatch 活动用户指南](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/)。有关 CloudWatch指标的更多信息，请参阅[亚马逊 CloudWatch 用户指南中的使用亚马逊 CloudWatch指标](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/working_with_metrics.html)[*和创建亚马逊 CloudWatch*警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

**Topics**
+ [

# 使用监控 Amazon EMR 指标 CloudWatch
](UsingEMR_ViewingMetrics.md)
+ [

# 使用以下方式监控 Amazon EMR 事件 CloudWatch
](emr-manage-cloudwatch-events.md)
+ [

# 回应来自亚马逊 EMR CloudWatch 的事件
](emr-events-response.md)

# 使用监控 Amazon EMR 指标 CloudWatch
监控指标。

每五分钟更新一次，并自动收集每个 Amazon EMR 集群 CloudWatch 的指标并将其推送到每个 Amazon EMR 集群。此时间间隔是不可配置的。中报告的亚马逊 EMR 指标不收取任何费用。 CloudWatch这些五分钟的数据点指标会归档 63 天，之后数据将被丢弃。

## 如何使用 Amazon EMR 指标？


下表显示了 Amazon EMR 报告指标的常见用途。这些是入门建议，并不全面。有关由 Amazon EMR 报告的指标的完整列表，请参阅[亚马逊 EMR 报告的指标 CloudWatch](#UsingEMR_ViewingMetrics_MetricsReported)。


****  

| 如何？ | 相关指标 | 
| --- | --- | 
| 跟踪我的集群进展 | 查看 RunningMapTasks、RemainingMapTasks、RunningReduceTasks 和 RemainingReduceTasks 指标。 | 
| 检测处于空闲状态的集群 | IsIdle 指标可跟踪某个集群 (非当前运行任务) 是否正在实时运行。您可以设置当集群闲置达到给定时长 (例如 30 分钟) 时便可引发的警报。 | 
| 检测节点何时用尽存储空间 | MRUnhealthyNodes 指标跟踪一个或多个核心节点或任务节点何时用尽本地磁盘存储空间并转换到 UNHEALTHY YARN 状态。例如，核心节点或任务节点在磁盘中的运行空间不足，并将无法运行任务。 | 
| 检测集群何时用尽存储空间 | HDFSUtilization 指标监控集群的组合 HDFS 容量，可能需要调整集群大小以添加更多核心节点。例如，HDFS 利用率较高，这可能会影响任务和集群运行状况。 | 
| 检测集群何时以更少容量运行 | MRLostNodes 指标跟踪一个或多个核心节点或任务节点何时无法与主节点通信。例如，主节点无法访问核心节点或任务节点。 | 

有关更多信息，请参阅[Amazon EMR 集群终止并显示 NO\$1SLAVE\$1LEFT，核心节点为 FAILED\$1BY\$1MASTER](emr-cluster-NO_SLAVE_LEFT-FAILED_BY_MASTER.md)和[AWSSupport-AnalyzeEMRLogs](https://docs.amazonaws.cn//systems-manager-automation-runbooks/latest/userguide/automation-awssupport-analyzeemrlogs.html)。

## 亚马逊 EMR 的访问 CloudWatch 指标


您可以使用亚马逊 EMR 控制台或控制台查看 A CloudWatch mazon EMR 报告的指标。CloudWatch 您也可以使用 CloudWatch CLI 命令`[mon-get-stats](https://docs.amazonaws.cn/AmazonCloudWatch/latest/cli/cli-mon-get-stats.html)`或 CloudWatch `[GetMetricStatistics](https://docs.amazonaws.cn/AmazonCloudWatch/latest/APIReference/API_GetMetricStatistics.html)` API 检索指标。有关 CloudWatch使用查看或检索 Amazon EMR 指标的更多信息，请参阅[ CloudWatch 亚马逊用户指南](https://docs.amazonaws.cn/AmazonCloudWatch/latest/DeveloperGuide/)。

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

**使用控制台查看指标**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要查看指标的集群。集群详细信息页面随即打开。

1. 在集群详细信息页面上选择 **Monitoring**（监控）选项卡。选择 **Cluster Status**（集群状态）、**Node Status**（节点状态）或 **Inputs and outputs**（输入和输出）选项中的任何一个，以加载有关集群进度和运行状况的报告。

1. 选择要查看的指标之后，您可以放大每个图表。要筛选图表的时间范围，请选择预填选项或选择 **Custom**（自定义）。

------

## 亚马逊 EMR 报告的指标 CloudWatch


下表列出了 Amazon EMR 在控制台中报告并推送到的指标。CloudWatch

### Amazon EMR 指标


Amazon EMR 将多个指标的数据发送到。 CloudWatch所有 Amazon EMR 集群会以五分钟的间隔自动发送指标。指标会存档两周。两周后，数据会被丢弃。

`AWS/ElasticMapReduce` 命名空间包括以下指标。

**注意**  
Amazon EMR 从集群中提取指标。如果无法连接到集群，则在此集群再次变成可用状态之前，EMR 将不会报告任何指标。

以下指标适用于 Hadoop 2.x 版本上运行的集群。


| 指标 | 说明 | 
| --- | --- | 
| 集群状态 | 
| IsIdle  | 指示集群不再执行任务，但仍处于活动状态并会产生费用。如果没有任何任务和任务处于运行状态，则此指标设置为 1；否则设置为 0。系统每隔五分钟检查一次该值，值为 1 仅表示在检查时集群处于空闲状态，并不表示它整个五分钟内都处于空闲状态。为避免误报，当多次连续 5 分钟检查获得的值均为 1 时，您应提出警报。例如，当该值在三十分钟或更长时间内都为 1 时，您应提出警报。 使用案例：监控集群性能 单位：*布尔值*  | 
| ContainerAllocated  | 分配的资源容器数量ResourceManager。 使用案例：监控集群进度 单位：*计数*  | 
| ContainerReserved  | 预留的容器数。 使用案例：监控集群进度 单位：*计数*  | 
| ContainerPending  | 队列中尚未分配的容器数。 使用案例：监控集群进度 单位：*计数*  | 
| ContainerPendingRatio  | 待处理容器与已分配容器的比率 (ContainerPendingRatio = ContainerPending / ContainerAllocated)。如果 ContainerAllocated = 0，则为 ContainerPendingRatio = ContainerPending。的值 ContainerPendingRatio 代表数字，而不是百分比。此值对基于容器分配行为扩展集群资源很有用。 单位：*计数*  | 
| AppsCompleted  | 提交给 YARN 并且已完成的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
| AppsFailed  | 提交给 YARN 并且未能完成的应用程序数。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 
| AppsKilled  | 提交给 YARN 并且已终止的应用程序数。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 
| AppsPending  | 提交给 YARN 并且处于挂起状态的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
| AppsRunning  | 提交给 YARN 并且正在运行的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
| AppsSubmitted  | 提交给 YARN 的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
| 节点状态 | 
| CoreNodesRunning  | 处于运行状态的核心节点的数量。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| CoreNodesPending  | 等待分配的核心节点的数量。请求的所有核心节点可能不会立即可用；此指标报告挂起的请求。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| LiveDataNodes  | 从 Hadoop 接收任务的数据节点的百分率。 使用案例：监控集群运行状况 单位：*百分比*  | 
| MRTotal节点  | 目前可供 MapReduce 作业使用的节点数量。等效于 YARN 指标 `mapred.resourcemanager.TotalNodes`。 使用案例：监控集群进度 单位：*计数* 注意： MRTotal节点仅计算系统中当前处于活动状态的节点。YARN 会自动从该计数中删除已终止的节点并停止对其进行跟踪，因此 MRTotal节点指标中不考虑这些节点。  | 
| MRActive节点  | 当前正在运行 MapReduce 任务或作业的节点数量。等效于 YARN 指标 `mapred.resourcemanager.NoOfActiveNodes`。 使用案例：监控集群进度 单位：*计数*  | 
| MRLost节点  | 分配给已标记为 L MapReduce OST 状态的节点的数量。等效于 YARN 指标 `mapred.resourcemanager.NoOfLostNodes`。 使用案例：监控集群运行状况，监控集群进度 单位：*计数*  | 
| MRUnhealthy节点  | 标记为 “运行状况不佳” 的 MapReduce 作业可用的节点数量。等效于 YARN 指标 `mapred.resourcemanager.NoOfUnhealthyNodes`。 使用案例：监控集群进度 单位：*计数*  | 
| MRDecommissioned节点  | 分配给已标记为 “已停用” 状态的 MapReduce 应用程序的节点数。等效于 YARN 指标 `mapred.resourcemanager.NoOfDecommissionedNodes`。 使用案例：监控集群运行状况，监控集群进度 单位：*计数*  | 
| MRRebooted节点  | 已重新启动并标记为 MapReduce 已重新启动状态的可用节点的数量。等效于 YARN 指标 `mapred.resourcemanager.NoOfRebootedNodes`。 使用案例：监控集群运行状况，监控集群进度 单位：*计数*  | 
| MultiMasterInstanceGroupNodesRunning  | 正在运行的主节点的数量。 使用案例：监控主节点故障和替换 单位：*计数*  | 
| MultiMasterInstanceGroupNodesRunningPercentage  | 正在运行的主节点超过所请求的主节点实例计数的百分比。 使用案例：监控主节点故障和替换 单位：*百分比*  | 
| MultiMasterInstanceGroupNodesRequested  | 请求的主节点数。 使用案例：监控主节点故障和替换 单位：*计数*  | 
| IO | 
| S3 BytesWritten  | 写入 Amazon S3 的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| S3 BytesRead  | 从 Amazon S3 读取的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| HDFSUtilization  | 当前使用的 HDFS 存储的百分率。 使用案例：分析集群性能 单位：*百分比*  | 
| HDFSBytes阅读  | 从 HDFS 读取的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| HDFSBytes书面的  | 写入 HDFS 的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| MissingBlocks  | HDFS 在其中没有副本的数据块的数量。这些数据块可能已损坏。 使用案例：监控集群运行状况 单位：*计数*  | 
| CorruptBlocks  | HDFS 报告的受损数据块的数量。 使用案例：监控集群运行状况 单位：*计数*  | 
| TotalLoad  | 并发数据传输的总数。 使用案例：监控集群运行状况 单位：*计数*  | 
| MemoryTotalMB  | 集群中的总内存量。 使用案例：监控集群进度 单位：*计数*  | 
| MemoryReservedMB  | 预留内存量。 使用案例：监控集群进度 单位：*计数*  | 
| MemoryAvailableMB  | 可供分配的内存量。 使用案例：监控集群进度 单位：*计数*  | 
| YARNMemoryAvailablePercentage  | YARN 可用的剩余内存百分比 (YARNMemoryAvailablePercentage = MemoryAvailable MB/ MemoryTotal MB)。此值对基于 YARN 内存使用量扩展集群资源很有用。 单位：*百分比*  | 
| MemoryAllocatedMB  | 分配给集群的内存量。 使用案例：监控集群进度 单位：*计数*  | 
| PendingDeletionBlocks  | 标记为进行删除的数据块数。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 
| UnderReplicatedBlocks  | 需要复制一次或多次的数据块数。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 
| DfsPendingReplicationBlocks  | 数据块复制状态：所复制的数据块、复制请求的存在时间以及不成功的复制请求。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 
| CapacityRemainingGB  | 剩余 HDFS 磁盘容量。 使用案例：监控集群进度，监控集群运行状况 单位：*计数*  | 

Hadoop 1 指标如下：


| 指标 | 说明 | 
| --- | --- | 
| 集群状态 | 
| IsIdle  | 指示集群不再执行任务，但仍处于活动状态并会产生费用。如果没有任何任务和任务处于运行状态，则此指标设置为 1；否则设置为 0。系统每隔五分钟检查一次该值，值为 1 仅表示在检查时集群处于空闲状态，并不表示它整个五分钟内都处于空闲状态。为避免误报，当多次连续 5 分钟检查获得的值均为 1 时，您应提出警报。例如，当该值在三十分钟或更长时间内都为 1 时，您应提出警报。 使用案例：监控集群性能 单位：*布尔值*  | 
| JobsRunning  | 集群中当前处于运行状态的任务数量。 使用案例：监控集群运行状况 单位：*计数*  | 
| JobsFailed  | 集群中失败的任务数量。 使用案例：监控集群运行状况 单位：*计数*  | 
| 映射/减少 | 
| MapTasksRunning  | 每个作业处于运行中的映射任务的数量。如果您安装了调度器并且有多个任务在运行，那么会生成多个图表。 使用案例：监控集群进度 单位：*计数*  | 
| MapTasksRemaining  | 每个作业的剩余映射任务的数量。如果您安装了调度器并且有多个任务在运行，那么会生成多个图表。剩余映射任务是指未处于任何以下状态的任务：运行中、已终止或已完成。 使用案例：监控集群进度 单位：*计数*  | 
| MapSlotsOpen  | 未使用的映射任务容量。该指标将计算为给定集群的最大映射任务数与该集群中当前运行的映射任务总数之差。 使用案例：分析集群性能 单位：*计数*  | 
| RemainingMapTasksPerSlot  | 剩余映射任务的总数与集群中可用映射插槽总数之比。 使用案例：分析集群性能 单位：*比率*  | 
| ReduceTasksRunning  | 每个作业处于运行中的缩减任务的数量。如果您安装了调度器并且有多个任务在运行，那么会生成多个图表。 使用案例：监控集群进度 单位：*计数*  | 
| ReduceTasksRemaining  | 每个作业的剩余缩减任务的数量。如果您安装了调度器并且有多个任务在运行，那么会生成多个图表。 使用案例：监控集群进度 单位：*计数*  | 
| ReduceSlotsOpen  | 未使用的缩减任务容量。该指标将计算为给定集群的最大缩减任务容量与该集群中当前运行的缩减任务数之差。 使用案例：分析集群性能 单位：*计数*  | 
| 节点状态 | 
| CoreNodesRunning  | 处于运行状态的核心节点的数量。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| CoreNodesPending  | 等待分配的核心节点的数量。请求的所有核心节点可能不会立即可用；此指标报告挂起的请求。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| LiveDataNodes  | 从 Hadoop 接收任务的数据节点的百分率。 使用案例：监控集群运行状况 单位：*百分比*  | 
| TaskNodesRunning  | 处于运行状态的任务节点的数量。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| TaskNodesPending  | 等待分配的任务节点的数量。请求的所有任务节点可能不会立即可用；此指标报告挂起的请求。仅当对应的实例组存在时，才会报告此指标的数据点。 使用案例：监控集群运行状况 单位：*计数*  | 
| LiveTaskTrackers  | 处于运行状态的任务跟踪程序的百分率。 使用案例：监控集群运行状况 单位：*百分比*  | 
| IO | 
| S3 BytesWritten  | 写入 Amazon S3 的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| S3 BytesRead  | 从 Amazon S3 读取的字节数。此指标仅汇总MapReduce 任务，不适用于 Amazon EMR 上的其他工作负载。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| HDFSUtilization  | 当前使用的 HDFS 存储的百分率。 使用案例：分析集群性能 单位：*百分比*  | 
| HDFSBytes阅读  | 从 HDFS 读取的字节数。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| HDFSBytes书面的  | 写入 HDFS 的字节数。 使用案例：分析集群性能，监控集群进度 单位：*计数*  | 
| MissingBlocks  | HDFS 在其中没有副本的数据块的数量。这些数据块可能已损坏。 使用案例：监控集群运行状况 单位：*计数*  | 
| TotalLoad  | 集群中所有 DataNodes 人报告的当前读者和作者总数。 用例：诊断高 I/O 可能在多大程度上导致作业执行性能不佳。运行 DataNode 守护程序的工作节点还必须执行映射和减少任务。随着时间的推移， TotalLoad 值持续偏高可能表明高值 I/O 可能是导致性能不佳的一个因素。此值的偶尔峰值属于常见情况，通常不指示问题。 单位：*计数*  | 

#### 集群容量指标


以下指标指示集群的当前容量或目标容量。仅当启用了托管扩展或自动终止时，这些指标才可用。

对于由实例集组成的集群，将在 `Units` 中测量集群容量指标。对于由实例组组成的集群，将根据托管扩展策略中使用的单位类型在 `Nodes` 或 `VCPU` 中测量集群容量指标。有关更多信息，请参阅 《Amazon EMR 管理指南》**中的[使用 EMR 托管扩展](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-managed-scaling.html)。


| 指标 | 说明 | 
| --- | --- | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html) | 集群units/nodes/vCPUs中的目标总数，由托管扩展确定。 单位：*计数*  | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html)  | 正在运行的集群中当前units/nodes/vCPUs可用的总数。当请求集群大小调整时，将在集群中添加或删除新实例后更新此指标。 单位：*计数*  | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html)  | 集群units/nodes/vCPUs中的目标 CORE 数量，由托管扩展确定。 单位：*计数*  | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html)  | 集群中当前units/nodes/vCPUs运行的 CORE 数量。 单位：*计数*  | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html)  | 集群units/nodes/vCPUs中任务的目标数量，由托管扩展决定。 单位：*计数*  | 
| [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html)  | 集群中当前units/nodes/vCPUs运行的 TASK 数量。 单位：*计数*  | 

### Amazon EMR 指标的维度


Amazon EMR 数据可以使用下表中的任一维度进行筛选。


| 维度  | 说明  | 
| --- | --- | 
| JobFlowId | 与 集群 ID 相同，它是集群的唯一标识符（以 j-XXXXXXXXXXXXX 形式表示）。您可以通过在 Amazon EMR 控制台中单击集群来找到该值。 | 

# 使用以下方式监控 Amazon EMR 事件 CloudWatch
监控事件

Amazon EMR 跟踪事件并在 Amazon EMR 控制台中保存其相关信息最多七天。当集群、实例组、实例集、自动扩缩策略或步骤的状态发生变化时，Amazon EMR 会记录事件。事件捕获事件发生的日期和时间、有关受影响元素的详细信息以及其他关键数据点。

下表列出了 Amazon EMR 事件，以及事件指示的状态或状态变更、事件的严重性、事件类型、事件代码和事件消息。Amazon EMR 将事件表示为 JSON 对象并将其自动发送到事件流。当您使用事件设置事件处理规则时，JSON 对象很重要，因为规则 CloudWatch 会寻求匹配 JSON 对象中的模式。有关更多信息，请参阅 [Amazon E [vents 用户指南中的事件和事件模式](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/CloudWatchEventsandEventPatterns.html)以及 Amazon EMR CloudWatch ](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/EventTypes.html#emr_event_type) *事件*。

**注意**  
EMR 会定期发出事件代码为 **EC2 预置：实例容量不足**的事件。当您的 Amazon EMR 集群在创建集群或调整集群大小操作期间遇到来自 Amazon EMR 的实例集或实例组容量不足错误时，会发生这些事件。一个事件可能不包括 AZs 您已提供的所有实例类型，因为 EMR 仅包含实例类型，并且自上次发出 “容量不足” 事件以来， AZs 它会尝试在中配置容量。有关如何响应这些事件的更多信息，请参阅[响应 Amazon EMR 集群实例容量不足事件](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-events-response-insuff-capacity.html)。

## 集群启动事件



| 状态或状态变更 | 严重性 | 事件类型 | 事件代码 | Message | 
| --- | --- | --- | --- | --- | 
| CREATING | WARN | EMR 实例集预置 | EC2 预置：实例容量不足 | 我们无法为实例集 InstanceFleetID 创建您的 Amazon EMR 集群 ClusterId (ClusterName) Amazon EC2 的实例类型 [Instancetype1, Instancetype2] 竞价容量不足，且可用区 [Instancetype3, Instancetype4] 中的实例类型 [AvailabilityZone1, AvaliabilityZone2] 的按需容量不足。有关如何应对此事件的更多信息，请查看此处的[文档](emr-EC2_INSUFFICIENT_CAPACITY-error.md)。 | 
| CREATING | WARN | EMR 实例组预置 | EC2 预置：实例容量不足 | 我们无法为实例组 InstanceGroupID 创建您的 Amazon EMR 集群 ClusterId (ClusterName) Amazon EC2 的实例类型 [Instancetype1, Instancetype2] 竞价容量不足，且可用区 [Instancetype3, Instancetype4] 中的实例类型 [AvailabilityZone1, AvaliabilityZone2] 的按需容量不足。有关如何应对此事件的更多信息，请查看此处的[文档](emr-EC2_INSUFFICIENT_CAPACITY-error.md)。 | 
| CREATING | WARN | EMR 实例集预置 | EC2 预置：子网中可用地址不足 | 我们无法创建您为实例集 InstanceFleetID 请求的 Amazon EMR 集群 ClusterId (ClusterName)，因为指定的子网 [Subnet1, Subnet2] 没有足够的可用私有 IP 地址来满足您的请求。使用 DescribeSubnets 操作查看您的子网中有多少 IP 地址可用（未使用）。有关如何响应此事件的信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html) | 
| CREATING | WARN | EMR 实例组预置 | EC2 预置：子网中可用地址不足 | 我们无法创建您为实例组 InstanceGroupID 请求的 Amazon EMR 集群 ClusterId (ClusterName)，因为指定的子网 [Subnet1, Subnet2] 没有足够的可用私有 IP 地址来满足您的请求。使用 DescribeSubnets 操作查看您的子网中有多少 IP 地址可用（未使用）。有关如何响应此事件的信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html) | 
| CREATING  | WARN  | EMR 实例集预置  | EC2 预置：已超出 vCPU 限制  | Amazon EMR 集群InstanceFleetIDClusterId (ClusterName)中的配置会延迟，因为您已达到分配给中正在运行的实例的 vCPUs （虚拟处理单元）数量的限制。account (accountId)有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)  | 
| CREATING  | WARN  | EMR 实例组预置  | EC2 预置：已超出 vCPU 限制  | 由于您已达到分配给账户InstanceGroupID中ClusterId正在运行的实例的 vCPUs （虚拟处理单元）数量的限制，因此在 Amazon EMR 集群中配置实例组会延迟。(accountId)有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)  | 
| CREATING  | WARN  | EMR 实例集预置  | EC2 预置：已超出竞价型实例数量限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例集 InstanceFleetID 预置会延迟，因为您在 account (accountId) 中启动的竞价型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| CREATING  | WARN  | EMR 实例组预置  | EC2 预置：已超出竞价型实例数量限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例组 InstanceGroupID 预置会延迟，因为您在 account (accountId) 中启动的竞价型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| CREATING  | WARN  | EMR 实例集预置  | EC2 预置：已超出实例限制  | Amazon EMR 集群 ClusterId (ClusterName) 中的实例集 InstanceFleetID 预置会延迟，因为您在 account (accountID) 中并发运行的实例数量已达到上限。有关 Amazon EC2 服务限制的更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| CREATING  | WARN  | EMR 实例组预置  | EC2 预置：已超出实例限制  | Amazon EMR 集群 ClusterId (ClusterName) 中的实例组 InstanceGroupID 预置会延迟，因为您在 account (accountID) 中并发运行的实例数量已达到上限。有关 Amazon EC2 服务限制的更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| CREATING | WARN | EMR 实例组预置 | *none* | Amazon EMR 集群 `ClusterId (ClusterName)` 于 `Time` 创建，并已准备就绪。 –或者–  Amazon EMR 集群 `ClusterId (ClusterName)` 于 `Time` 完成所有待处理步骤的运行。  处于 `WAITING` 状态的集群可能仍是正在处理的作业。   | 
| STARTING  | INFO  | EMR 集群状态更改  | *none*  | 已于 `Time` 请求 Amazon EMR 集群 `ClusterId (ClusterName)`，且当前正在创建中。  | 
| STARTING  | INFO  | EMR 集群状态更改  | *none*  |  仅适用于带实例集配置和 Amazon EC2 中选定的多个可用区的集群。  Amazon EMR 集群 `ClusterId (ClusterName)` 正在从指定可用区选项中选择的区域 (`AvailabilityZoneID`) 中创建。  | 
| STARTING  | INFO  | EMR 集群状态更改  | *none*  | Amazon EMR 集群 `ClusterId (ClusterName)` 于 `Time` 开始运行步骤。  | 
| WAITING  | INFO  | EMR 集群状态更改  | *none*  | Amazon EMR 集群 `ClusterId (ClusterName)` 于 `Time` 创建，并已准备就绪。 –或者–  Amazon EMR 集群 `ClusterId (ClusterName)` 于 `Time` 完成所有待处理步骤的运行。  处于 `WAITING` 状态的集群可能仍是正在处理的作业。   | 

**注意**  
当您的 EMR 集群在创建集群或调整集群大小操作期间遇到来自 Amazon EC2 的实例集或实例组容量不足错误时，会定期触发事件代码为 `EC2 provisioning - Insufficient Instance Capacity` 的事件。有关如何响应这些事件的更多信息，请参阅 [响应 Amazon EMR 集群实例容量不足事件](emr-events-response-insuff-capacity.md)。

## 集群终止事件



| 状态或状态变更 | 严重性 | 事件类型 | 事件代码 | Message | 
| --- | --- | --- | --- | --- | 
| TERMINATED  | 严重性视状态变更原因而定，如下所述： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html)  | EMR 集群状态更改  | *none*  | Amazon EMR 集群 `ClusterId (ClusterName)` 已于 `Time` 终止，原因是 `StateChangeReason:Code`。  | 
| TERMINATED\$1WITH\$1ERRORS  | CRITICAL  | EMR 集群状态更改  | *none*  | Amazon EMR 集群 `ClusterId (ClusterName)` 已于 `Time` 因错误终止，原因是 `StateChangeReason:Code`。  | 
| TERMINATED\$1WITH\$1ERRORS  | CRITICAL  | EMR 集群状态更改  | *none*  | Amazon EMR 集群 `ClusterId (ClusterName)` 已于 `Time` 因错误终止，原因是 `StateChangeReason:Code`。  | 

## 实例集状态更改事件


**注意**  
实例集配置仅在 Amazon EMR 发行版 4.8.0 及更高版本（不包括 5.0.0 和 5.0.3）中可用。


****  

| 状态或状态变更 | 严重性 | 事件类型 | 事件代码 | Message | 
| --- | --- | --- | --- | --- | 
| 从 `PROVISIONING` 到 `WAITING`  | INFO  |  | none | Amazon EMR 集群 `InstanceFleetID` 中对实例集 `ClusterId (ClusterName)` 的预置已完成。预置已于 `Time` 开始，并且已花费 `Num` 分钟。实例集现在的按需容量为 `Num`，竞价型容量为 `Num`。目标按需容量为 `Num`，目标竞价型容量为 `Num`。  | 
| 从 `WAITING` 到 `RESIZING`  | INFO  |  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例集 `InstanceFleetID` 的大小调整已于 `Time` 开始。实例集的大小从按需容量 `Num` 调整到目标的 `Num`，而竞价型容量则从 `Num` 调整到目标的 `Num`。  | 
| 从 `RESIZING` 到 `WAITING`  | INFO  |  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 `InstanceFleetID` 的大小调整操作已完成。大小调整已于 `Time` 开始，并且已花费 `Num` 分钟。实例集现在的按需容量为 `Num`，竞价型容量为 `Num`。目标按需容量为 `Num`，目标竞价型容量为 `Num`。  | 
| 从 `RESIZING` 到 `WAITING`  | INFO  |  | none | Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 `InstanceFleetID` 的大小调整操作已超时并且已停止。大小调整已于 `Time` 开始，并且在 `Num` 分钟后停止。实例集现在的按需容量为 `Num`，竞价型容量为 `Num`。目标按需容量为 `Num`，目标竞价型容量为 `Num`。  | 
| SUSPENDED  | ERROR  |  | none | 由于以下原因，Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 `InstanceFleetID` 于 `Time` 被捕获：`ReasonDesc`。  | 
| RESIZING  | WARNING  |  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 `InstanceFleetID` 的大小调整操作发生卡顿，原因为：`ReasonDesc`。  | 
| `WAITING` 或 `Running`  | INFO  |  | none | 当 Amazon EMR 在可用区 `AvailabilityZone` 中添加竞价型容量时，无法完成 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 `InstanceFleetID` 的大小调整操作。已取消您预置额外 Spot 容量的请求。有关推荐的操作，请查看 [Amazon EMR 集群的可用区灵活性](emr-flexibility.md) 并重试。  | 
| `WAITING` 或 `Running`  | INFO  |  | none | Amazon EMR 集群 `InstanceFleetID` 中的实例集 `ClusterId (ClusterName)` 的大小调整操作由 `Entity` 于 `Time` 启动。  | 

## 实例集重新配置事件



****  

| 状态或状态变更 | 严重性 | 消息 | 
| --- | --- | --- | 
| 已请求重新配置实例集  | INFO  | 用户已请求重新配置 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID`。  | 
| 实例集重新配置开始  | INFO  | Amazon EMR 已于 `Time` 开始重新配置 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID`。  | 
| 实例集重新配置已完成  | INFO  | Amazon EMR 已完成重新配置 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID`。  | 
| 实例集重新配置失败  | WARNING  | Amazon EMR 已于 `Time` 重新配置 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID` 失败。重新配置失败是因为 `Reason`。  | 
| 实例集重新配置恢复开始  | INFO  | Amazon EMR 正在将 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID` 恢复到之前的成功配置。  | 
| 实例集重新配置恢复已完成  | INFO  | Amazon EMR 已完成将 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID` 恢复到之前的成功配置。  | 
| 实例集重新配置恢复失败  | CRITICAL  | Amazon EMR 已于 `Time` 将 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID` 恢复到之前的成功配置失败。重新配置恢复失败是因为 `Reason`。  | 
| 已阻止实例集重新配置恢复  | INFO  | 由于实例集处于 `State` 状态，Amazon EMR 于 `Time` 暂时阻止 Amazon EMR 集群 `ClusterId` (`ClusterName`) 中的实例集 `InstanceFleetID`。  | 

## 实例集大小调整事件



****  

| 事件类型 | 严重性 | 事件代码 | Message | 
| --- | --- | --- | --- | 
| EMR 实例集调整大小   | ERROR | 竞价型预置超时  | 在可用区 `AvailabilityZone` 中获取竞价型容量时，无法完成 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例集 `InstanceFleetID` 的大小调整操作。我们现在已经取消了您的请求并停止尝试预置任何额外的竞价型容量，并且实例集已经预置了 `num` 的竞价型容量。目标竞价型容量为 `num`。有关更多信息和建议的操作，请查看[此处](emr-flexibility.md)的文档页面，然后重试。  | 
| EMR 实例集调整大小   | ERROR | 按需预置超时  | 在可用区 `AvailabilityZone` 中获取按需容量时，无法完成 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例集 `InstanceFleetID` 的大小调整操作。我们现在已经取消了您的请求并停止尝试预置任何额外的按需容量，并且实例集已经预置了 `num` 的按需容量。目标按需容量为 `num`。有关更多信息和建议的操作，请查看[此处](emr-flexibility.md)的文档页面，然后重试。  | 
| EMR 实例集调整大小   | WARNING | EC2 预置：实例容量不足 | 我们无法完成 EMR 集群 `ClusterId (ClusterName)` 中实例集 `InstanceFleetID` 的大小调整操作，因为Amazon EC2 实例类型 `[Instancetype1, Instancetype2]` 的竞价型容量不足，且可用区 `[AvailabilityZone1]` 中的实例类型 `[Instancetype3, Instancetype4]` 的按需容量不足。实例集预置的按需容量为 `num`，目标按需容量为 `num`。预置的竞价型容量为 `num`，目标竞价型容量为 `num`。有关如何应对此事件的更多信息，请查看此处的[文档](emr-EC2_INSUFFICIENT_CAPACITY-error.md)。  | 
| EMR 实例集调整大小   | WARNING | 竞价型预置超时：继续调整大小  | 我们仍在为实例集大小调整操作预置竞价型容量，该操作于 `time` 在可用区 `AvailabilityZone` 中 `[Instancetype1, Instancetype2]` 的 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 ID `InstanceFleetID` 启动。对于在 `time` 启动的之前的大小调整操作，超时时间已过期，因此 Amazon EMR 在将请求的 `num` 实例的 `num` 添加到您的实例集后停止预置竞价型容量。有关更多信息，请查看[此处](emr-flexibility.md)的文档页面。 | 
| EMR 实例集调整大小   | WARNING | 按需预置超时：继续调整大小  | 我们仍在为实例集大小调整操作预置按需容量，该操作于 `time` 在可用区 `AvailabilityZone` 中 `[Instancetype1, Instancetype2]` Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例集 ID `InstanceFleetID` 启动。对于在 `time` 启动的之前的大小调整操作，超时时间已过期，因此 Amazon EMR 在将请求的 `num` 实例的 `num` 添加到您的实例集后停止预置按需容量。有关更多信息，请查看[此处](emr-flexibility.md)的文档页面。 | 
| EMR 实例集调整大小   | WARNING | EC2 预置：子网中可用地址不足  | 我们无法完成 Amazon EMR 集群 ClusterId (ClusterName) 中实例集 InstanceFleetID 的调整大小操作，因为指定的子网 [Subnet1, Subnet2] 没有足够的可用私有 IP 地址来满足您的请求。使用 DescribeSubnets 操作查看您的子网中有多少 IP 地址可用（未使用）。有关如何响应此事件的信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例集调整大小   | WARNING | EC2 预置：已超出 vCPU 限制  | Amazon EMR 集群InstanceFleetIDClusterName中实例队列的大小会延迟，因为您已达到分配给中正在运行的实例的 vCPUs （虚拟处理单元）数量的限制。account (accountId)有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例集调整大小  | WARNING | EC2 预置：已超出竞价型实例数量限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例集 InstanceFleetID 预置会延迟，因为您在 account (accountId) 中启动的竞价型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例集调整大小   | WARNING | EC2 预置：已超出实例限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例集 InstanceFleetID 预置会延迟，因为您在 account (accountId) 中运行的按需型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 

**注意**  
超时到期后，当 Amazon EMR 停止为实例集预置竞价型或按需容量时，就会发出预置超时事件。有关如何响应这些事件的更多信息，请参阅 [响应 Amazon EMR 集群实例集调整大小超时事件](emr-events-response-timeout-events.md)。

## 实例组事件



****  

| 事件类型 | 严重性 | 事件代码 | Message | 
| --- | --- | --- | --- | 
| 从 `RESIZING` 到 `Running`  | INFO  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的大小调整操作已完成。它当前拥有 `Num` 个实例。大小调整操作已于 `Time` 开始，花费 `Num` 分钟时间完成。  | 
| 从 `RUNNING` 到 `RESIZING`  | INFO  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的大小调整已于 `Time` 开始。它的实例数从 `Num` 个调整为 `Num` 个。  | 
| SUSPENDED  | ERROR  | none | 由于以下原因，Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 于 `Time` 被捕获：`ReasonDesc`。  | 
| RESIZING  | WARNING  | none | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的大小调整操作发生卡顿，原因为：`ReasonDesc`。  | 
| EMR 实例组调整大小   | WARNING | EC2 预置：实例容量不足 | 我们无法完成 EMR 集群 `ClusterId (ClusterName)` 中于 `time` 开始对实例组 `InstanceGroupID` 的调整大小操作，因为 Amazon EC2 在可用区 `[AvailabilityZone1]` 中的实例类型 `[Instancetype]` 容量 `Spot/On Demand` 不足。到目前为止，该实例组的运行实例计数为 `num`，请求的实例计数为 `num`。有关如何应对此事件的更多信息，请查看此处的[文档](emr-EC2_INSUFFICIENT_CAPACITY-error.md)。  | 
| EMR 实例组调整大小   | WARNING | EC2 预置：子网中可用地址不足  | 我们无法完成 Amazon EMR 集群 ClusterId (ClusterName) 中实例组 InstanceGroupID 的调整大小操作，因为指定的子网 [Subnet1, Subnet2] 没有足够的可用私有 IP 地址来满足您的请求。使用 DescribeSubnets 操作查看您的子网中有多少 IP 地址可用（未使用）。有关如何响应此事件的信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例组调整大小   | WARNING | EC2 预置：已超出 vCPU 限制  | Amazon EMR 集群InstanceGroupIDClusterName中实例组的大小会延迟，因为您已达到分配给中正在运行的实例的 vCPUs （虚拟处理单元）数量的限制。account (accountId)有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例组调整大小   | WARNING | EC2 预置：已超出竞价型实例数量限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例组 InstanceGroupID 预置会延迟，因为您在 account (accountId) 中启动的竞价型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| EMR 实例组调整大小   | WARNING | EC2 预置：已超出实例限制  | Amazon EMR 集群 ClusterID (ClusterName) 中的实例组 InstanceGroupID 预置会延迟，因为您在 account (accountId) 中运行的按需型实例数量已达到上限。有关更多信息，请参阅 [Amazon EC2 API 的错误代码](https://docs.amazonaws.cn/AWSEC2/latest/APIReference/errors-overview.html)。 | 
| 从 `RUNNING` 到 `RESIZING`  | INFO  | none | Amazon EMR 集群 `InstanceGroupID` 中的实例组 `ClusterId (ClusterName)` 的大小调整由 `Entity` 于 `Time` 启动。  | 

**注意**  
对于 Amazon EMR 5.21.0 及更高版本，您可以覆盖集群配置，并为运行的集群中的每个实例组指定额外的配置分类。您可以使用 Amazon EMR 控制台、 Amazon Command Line Interface (Amazon CLI) 或软件开发工具包来完成此操作。 Amazon 有关更多信息，请参阅[为运行的集群中的实例组提供配置](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-configure-apps-running-cluster.html)。

下表列出了重新配置操作的 Amazon EMR 事件，以及事件指示的状态或状态变更、事件的严重性和事件消息。


****  

| 状态或状态变更 | 严重性 | 消息 | 
| --- | --- | --- | 
| RUNNING  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的重新配置由用户于 `Time` 启动。请求的配置版本为 `Num`。  | 
| 从 `RECONFIGURING` 到 `Running` | INFO  | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的重新配置操作已完成。重新配置已于 `Time` 开始，花费 `Num` 分钟完成。当前配置版本为 `Num`。  | 
| 从 `RUNNING` 到 `RECONFIGURING` in  | INFO  | 对 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的重新配置已于 `Time` 开始。它从版本号 `Num` 配置为版本号 `Num`。  | 
| RESIZING  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的配置版本 `Num` 的重新配置操作在 `Time` 被临时阻止，因为实例组处于 `State` 状态。  | 
| RECONFIGURING  | INFO  | Amazon EMR 集群 ClusterId (ClusterName) 中实例组 Time 的实例计数 Num 的调整大小操作在 InstanceGroupID 被临时阻止，因为实例组处于 State 状态。 | 
| RECONFIGURING  | WARNING  | Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的重新配置操作于 `Time` 失败，失败之前经过了 `Num` 分钟。失败的配置版本为 `Num`。  | 
| RECONFIGURING  | INFO  | 配置正在恢复到在 `Time` 时 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的上一个成功版本号 `Num`。新配置版本为 `Num`。  | 
| 从 `RECONFIGURING` 到 `Running` | INFO  | 配置已成功恢复到在 `Time` 时 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的上一个成功版本号 `Num`。新配置版本为 `Num`。  | 
| 从 `RECONFIGURING` 到 `SUSPENDED`  | CRITICAL  | 无法恢复到在 `Time` 时 Amazon EMR 集群 `ClusterId (ClusterName)` 中实例组 `InstanceGroupID` 的上一个成功版本号 `Num`。  | 

## 自动伸缩策略事件



****  

| 状态或状态变更 | 严重性 | 消息 | 
| --- | --- | --- | 
| PENDING  | INFO  | 自动扩缩策略已于 `Time` 添加到 Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID`。策略正在等待附加。 –或者–  Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的自动扩缩策略已于 `Time` 更新。策略正在等待附加。  | 
| ATTACHED  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的自动扩缩策略已于 `Time` 附加。  | 
| `DETACHED`  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的自动扩缩策略已于 `Time` 分离。  | 
| FAILED  | ERROR  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的自动扩缩策略无法附加，并于 `Time` 失败。 –或者–  Amazon EMR 集群 `ClusterId (ClusterName)` 中的实例组 `InstanceGroupID` 的自动扩缩策略无法分离，并于 `Time` 失败。  | 

## 步骤事件



****  

| 状态或状态变更 | 严重性 | 消息 | 
| --- | --- | --- | 
| PENDING  | INFO  | 步骤 `StepID (StepName)` 已于 `Time` 添加到 Amazon EMR 集群 `ClusterId (ClusterName)`，正在等待执行。  | 
| CANCEL\$1PENDING  | WARN  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的步骤 `StepID (StepName)` 已于 `Time` 取消，正在等待取消。  | 
| RUNNING  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的步骤 `StepID (StepName)` 已于 `Time` 开始运行。  | 
| COMPLETED  | INFO  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的步骤 `Time` 已于 `StepID (StepName)` 完成执行。此步骤已于 `Time` 开始运行，花费 `Num` 分钟时间完成。  | 
| CANCELLED  | WARN  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的集群步骤 `StepID (StepName)` 的取消请求于 `Time` 成功完成，此步骤现已取消。  | 
| FAILED  | ERROR  | Amazon EMR 集群 `ClusterId (ClusterName)` 中的步骤 `StepID (StepName)` 于 `Time` 失败。  | 

## 运行状况不佳的节点替换事件



| 事件类型 | 严重性 | 事件代码 | Message | 
| --- | --- | --- | --- | 
| Amazon EMR 运行状况不佳的节点替换 | INFO | 检测到运行状况不佳的核心节点 | Amazon EMR 已确定 Amazon EMR 集群 `clusterID (ClusterName)` 中 `InstanceGroup/Fleet` 的核心实例 `[instanceID (InstanceName)]` 为 `UNHEALTHY`。Amazon EMR 将尝试恢复或正常替换 `UNHEALTHY` 实例。  | 
| Amazon EMR 运行状况不佳的节点替换 | INFO | 核心节点运行状况不佳：替换已禁用 | Amazon EMR 已确定 Amazon EMR 集群 `(clusterID) (ClusterName)` 中 `InstanceGroup/Fleet` 的核心实例 `[instanceID (InstanceName)]` 为 `UNHEALTHY`。在集群中启用正常运行状况不佳的核心节点替换，以允许 Amazon EMR 在实例无法恢复的情况下正常替换 `UNHEALTHY` 实例。  | 
| Amazon EMR 运行状况不佳的节点替换 | WARN | 未替换运行状况不佳的核心节点 | 由于某些*原因*，Amazon EMR 无法替换 Amazon EMR 集群 `clusterID (ClusterName)` 中 `InstanceGroup/Fleet` 的 `UNHEALTHY` 核心实例 `[instanceID (InstanceName)]`。 Amazon EMR 无法替换核心节点的原因因具体场景而异。例如，Amazon EMR 无法删除节点的原因之一是集群中没有剩余的核心节点。  | 
| Amazon EMR 运行状况不佳的节点替换 | INFO | 运行状况不佳的核心节点已恢复 | Amazon EMR 已在 Amazon EMR 集群 `clusterID (ClusterName)` 的 `InstanceGroup/Fleet` 中恢复了 `UNHEALTHY` 核心实例 `[instanceID (InstanceName)]`  | 

有关运行状况不佳的节点替换的更多信息，请参阅[替换运行状况不佳的节点](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-node-replacement.html)。

## 使用 Amazon EMR 控制台查看事件
在控制台中查看事件

对于每个集群，您可以在详细信息窗格中查看简单的事件列表，该列表按发生顺序降序列出事件。您还可以按照事件发生顺序的降序查看区域中所有集群的所有事件。

如果您不希望用户查看区域的所有集群事件，请向附加到用户的策略添加一条语句，该语句拒绝对 `"Effect": "Deny"` 操作的权限 (`elasticmapreduce:ViewEventsFromAllClustersInConsole`)。

**使用控制台查看区域中所有集群的事件**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Events**（事件）。

**使用控制台查看特定集群的事件**

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

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

1. 要查看您的所有事件，请在集群详细信息页面上选择 **Events**（事件）选项卡。

# 回应来自亚马逊 EMR CloudWatch 的事件
响应事件

[本节介绍如何响应 Amazon EMR 作为事件消息发出的CloudWatch 可操作事件。](emr-manage-cloudwatch-events.md)响应事件的方式包括创建规则、设置警报和其他响应。以下部分包括程序的链接以及对常见事件的建议响应。

**Topics**
+ [

# 使用为 Amazon EMR 事件创建规则 CloudWatch
](emr-events-cloudwatch-console.md)
+ [

# 根据 Amazon EM CloudWatch R 中的指标设置警报
](UsingEMR_ViewingMetrics_Alarm.md)
+ [

# 响应 Amazon EMR 集群实例容量不足事件
](emr-events-response-insuff-capacity.md)
+ [

# 响应 Amazon EMR 集群实例集调整大小超时事件
](emr-events-response-timeout-events.md)

# 使用为 Amazon EMR 事件创建规则 CloudWatch
创建规则

Amazon EMR 会自动将事件发送到 CloudWatch 事件流。您可以根据特定的模式创建匹配事件的规则，以便将事件路由到目标来执行操作，如发送电子邮件通知。针对事件的 JSON 对象匹配模式。有关亚马逊 EMR 事件详情的更多信息，请参阅《亚马逊活动用户指南》[中的*亚马 CloudWatch *逊 EMR](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/EventTypes.html#emr_event_type) 事件。

有关设置 CloudWatch 事件规则的信息，请参阅[创建在事件上触发的 CloudWatch 规则](https://docs.amazonaws.cn/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Rule.html)。

# 根据 Amazon EM CloudWatch R 中的指标设置警报
设置警报

亚马逊 EMR 将指标推送给亚马逊。 CloudWatch作为响应，您可以使用 CloudWatch 对您的 Amazon EMR 指标设置警报。例如，您可以在中配置警报， CloudWatch 以便在 HDFS 利用率上升到 80% 以上时随时向您发送电子邮件。有关详细说明，请参阅《*Amazon CloudWatch 用户指南》*中的[创建或编辑 CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/ConsoleAlarms.html)。

# 响应 Amazon EMR 集群实例容量不足事件
响应容量不足事件

## 概述
概述

当所选可用区没有足够的容量来满足您的集群启动或调整大小请求时，Amazon EMR 集群会返回事件代码 `EC2 provisioning - Insufficient Instance Capacity`。如果 Amazon EMR 反复遇到容量不足异常，并且无法满足您的集群启动或集群调整大小操作的预置请求，则对于实例组和实例集该事件都会定期触发。

本页介绍在 EMR 集群发生此类事件时，如何最好地响应此类事件。

## 对容量不足事件的建议响应
建议

我们建议您通过以下方式之一来应对容量不足事件：
+ 等待容量恢复。容量经常变化，因此容量不足的异常可以自行恢复。只要 Amazon EC2 容量可用，您的集群就会开始或完成大小调整。
+ 或者，您可以终止集群，修改实例类型配置，然后使用更新的集群配置请求创建新集群。有关更多信息，请参阅 [Amazon EMR 集群的可用区灵活性](emr-flexibility.md)。

您还可以设置对容量不足事件的规则或自动响应，如下一节所述。

## 从容量不足事件中自动恢复
自动化示例

您可以构建自动化以响应 Amazon EMR 事件，例如带有事件代码 `EC2 provisioning - Insufficient Instance Capacity` 的事件。例如，以下 Amazon Lambda 函数终止具有使用按需实例的实例组的 EMR 集群，然后创建一个新的 EMR 集群，其实例组包含的实例类型与原始请求不同。

以下条件会触发自动流程的发生：
+ 主节点或核心节点的容量不足事件已持续超过 20 分钟。
+ 集群未处于**就绪**或**等待**状态。有关 EMR 集群状态的更多信息，请参阅 [了解集群的生命周期](emr-overview.md#emr-overview-cluster-lifecycle)。

**注意**  
在为容量不足异常建立自动化流程时，应考虑容量不足事件是可以恢复的。容量经常发生变化，只要 Amazon EC2 容量可用，您的集群就会恢复调整大小或开始操作。

**Example 响应容量不足事件的功能**  

```
// Lambda code with Python 3.10 and handler is lambda_function.lambda_handler
// Note: related IAM role requires permission to use Amazon EMR

import json
import boto3
import datetime
from datetime import timezone

INSUFFICIENT_CAPACITY_EXCEPTION_DETAIL_TYPE = "EMR Instance Group Provisioning"
INSUFFICIENT_CAPACITY_EXCEPTION_EVENT_CODE = (
    "EC2 provisioning - Insufficient Instance Capacity"
)
ALLOWED_INSTANCE_TYPES_TO_USE = [
    "m5.xlarge",
    "c5.xlarge",
    "m5.4xlarge",
    "m5.2xlarge",
    "t3.xlarge",
]
CLUSTER_START_ACCEPTABLE_STATES = ["WAITING", "RUNNING"]
CLUSTER_START_SLA = 20

CLIENT = boto3.client("emr", region_name="us-east-1")

# checks if the incoming event is 'EMR Instance Fleet Provisioning' with eventCode 'EC2 provisioning - Insufficient Instance Capacity'
def is_insufficient_capacity_event(event):
    if not event["detail"]:
        return False
    else:
        return (
            event["detail-type"] == INSUFFICIENT_CAPACITY_EXCEPTION_DETAIL_TYPE
            and event["detail"]["eventCode"]
            == INSUFFICIENT_CAPACITY_EXCEPTION_EVENT_CODE
        )


# checks if the cluster is eligible for termination
def is_cluster_eligible_for_termination(event, describeClusterResponse):
    # instanceGroupType could be CORE, MASTER OR TASK
    instanceGroupType = event["detail"]["instanceGroupType"]
    clusterCreationTime = describeClusterResponse["Cluster"]["Status"]["Timeline"][
        "CreationDateTime"
    ]
    clusterState = describeClusterResponse["Cluster"]["Status"]["State"]

    now = datetime.datetime.now()
    now = now.replace(tzinfo=timezone.utc)
    isClusterStartSlaBreached = clusterCreationTime < now - datetime.timedelta(
        minutes=CLUSTER_START_SLA
    )

    # Check if instance group receiving Insufficient capacity exception is CORE or PRIMARY (MASTER),
    # and it's been more than 20 minutes since cluster was created but the cluster state and the cluster state is not updated to RUNNING or WAITING
    if (
        (instanceGroupType == "CORE" or instanceGroupType == "MASTER")
        and isClusterStartSlaBreached
        and clusterState not in CLUSTER_START_ACCEPTABLE_STATES
    ):
        return True
    else:
        return False


# Choose item from the list except the exempt value
def choice_excluding(exempt):
    for i in ALLOWED_INSTANCE_TYPES_TO_USE:
        if i != exempt:
            return i


# Create a new cluster by choosing different InstanceType.
def create_cluster(event):
    # instanceGroupType cloud be CORE, MASTER OR TASK
    instanceGroupType = event["detail"]["instanceGroupType"]

    # Following two lines assumes that the customer that created the cluster already knows which instance types they use in original request
    instanceTypesFromOriginalRequestMaster = "m5.xlarge"
    instanceTypesFromOriginalRequestCore = "m5.xlarge"

    # Select new instance types to include in the new createCluster request
    instanceTypeForMaster = (
        instanceTypesFromOriginalRequestMaster
        if instanceGroupType != "MASTER"
        else choice_excluding(instanceTypesFromOriginalRequestMaster)
    )
    instanceTypeForCore = (
        instanceTypesFromOriginalRequestCore
        if instanceGroupType != "CORE"
        else choice_excluding(instanceTypesFromOriginalRequestCore)
    )

    print("Starting to create cluster...")
    instances = {
        "InstanceGroups": [
            {
                "InstanceRole": "MASTER",
                "InstanceCount": 1,
                "InstanceType": instanceTypeForMaster,
                "Market": "ON_DEMAND",
                "Name": "Master",
            },
            {
                "InstanceRole": "CORE",
                "InstanceCount": 1,
                "InstanceType": instanceTypeForCore,
                "Market": "ON_DEMAND",
                "Name": "Core",
            },
        ]
    }
    response = CLIENT.run_job_flow(
        Name="Test Cluster",
        Instances=instances,
        VisibleToAllUsers=True,
        JobFlowRole="EMR_EC2_DefaultRole",
        ServiceRole="EMR_DefaultRole",
        ReleaseLabel="emr-6.10.0",
    )

    return response["JobFlowId"]


# Terminated the cluster using clusterId received in an event
def terminate_cluster(event):
    print("Trying to terminate cluster, clusterId: " + event["detail"]["clusterId"])
    response = CLIENT.terminate_job_flows(JobFlowIds=[event["detail"]["clusterId"]])
    print(f"Terminate cluster response: {response}")


def describe_cluster(event):
    response = CLIENT.describe_cluster(ClusterId=event["detail"]["clusterId"])
    return response


def lambda_handler(event, context):
    if is_insufficient_capacity_event(event):
        print(
            "Received insufficient capacity event for instanceGroup, clusterId: "
            + event["detail"]["clusterId"]
        )

        describeClusterResponse = describe_cluster(event)

        shouldTerminateCluster = is_cluster_eligible_for_termination(
            event, describeClusterResponse
        )
        if shouldTerminateCluster:
            terminate_cluster(event)

            clusterId = create_cluster(event)
            print("Created a new cluster, clusterId: " + clusterId)
        else:
            print(
                "Cluster is not eligible for termination, clusterId: "
                + event["detail"]["clusterId"]
            )

    else:
        print("Received event is not insufficient capacity event, skipping")
```

# 响应 Amazon EMR 集群实例集调整大小超时事件
响应实例集调整大小超时事件

## 概述
概述

Amazon EMR 集群在对实例集集群执行调整大小操作时会发出[事件](emr-manage-cloudwatch-events.md#emr-cloudwatch-instance-fleet-resize-events)。超时到期后，当 Amazon EMR 停止为实例集预置竞价型或按需容量时，就会发出预置超时事件。用户可以将超时持续时间配置为实例集[调整大小规范](https://docs.amazonaws.cn/emr/latest/APIReference/API_InstanceFleetResizingSpecifications.html)的一部分。在对相同实例集连续调整大小的情况下，当前调整大小操作的超时到期时，Amazon EMR 会发出 `Spot provisioning timeout - continuing resize` 或 `On-Demand provisioning timeout - continuing resize` 事件。然后，它开始为队列的下一次调整大小操作预置容量。

## 响应实例集调整大小超时事件
建议

我们建议您通过以下方式之一来响应预置超时事件：
+ 重访[调整大小规范](https://docs.amazonaws.cn/emr/latest/APIReference/API_InstanceFleetResizingSpecifications.html)，然后重试调整大小操作。由于容量频繁变化，只要 Amazon EC2 容量可用，您的集群就会成功调整大小。我们建议客户为要求更严格的任务配置较低的超时持续时间值SLAs。
+ 或者，您可以：
  + 根据[实例和可用区灵活性的最佳实践](emr-flexibility.md#emr-flexibility-types)启动具有多种实例类型的新集群，或
  + 启动具有按需容量的集群
+ 对于配置超时：继续调整事件大小，您还可以等待调整大小操作的处理。Amazon EMR 将继续按顺序处理针对实例触发的调整大小操作，同时遵守配置的调整大小规范。

您还可以设置对该事件的规则或自动响应，如下一节所述。

## 自动从预置超时事件中恢复
自动化示例

您可以使用 `Spot Provisioning timeout` 事件代码构建自动化以响应 Amazon EMR 事件。例如，以下 Amazon Lambda 函数关闭了具有使用竞价型实例作为任务节点的实例集的 EMR 集群，然后创建一个新的 EMR 集群，其实例集包含的实例类型比原始请求更加多样化。在此示例中，为任务节点发出的 `Spot Provisioning timeout` 事件将触发 Lambda 函数的执行。

**Example 响应 `Spot Provisioning timeout` 事件的示例函数**  

```
// Lambda code with Python 3.10 and handler is lambda_function.lambda_handler
// Note: related IAM role requires permission to use Amazon EMR
 
import json
import boto3
import datetime
from datetime import timezone
 
SPOT_PROVISIONING_TIMEOUT_EXCEPTION_DETAIL_TYPE = "EMR Instance Fleet Resize"
SPOT_PROVISIONING_TIMEOUT_EXCEPTION_EVENT_CODE = (
    "Spot Provisioning timeout"
)
 
CLIENT = boto3.client("emr", region_name="us-east-1")
 
# checks if the incoming event is 'EMR Instance Fleet Resize' with eventCode 'Spot provisioning timeout'
def is_spot_provisioning_timeout_event(event):
    if not event["detail"]:
        return False
    else:
        return (
            event["detail-type"] == SPOT_PROVISIONING_TIMEOUT_EXCEPTION_DETAIL_TYPE
            and event["detail"]["eventCode"]
            == SPOT_PROVISIONING_TIMEOUT_EXCEPTION_EVENT_CODE
        )
 
 
# checks if the cluster is eligible for termination
def is_cluster_eligible_for_termination(event, describeClusterResponse):
    # instanceFleetType could be CORE, MASTER OR TASK
    instanceFleetType = event["detail"]["instanceFleetType"]
 
    # Check if instance fleet receiving Spot provisioning timeout event is TASK
    if (instanceFleetType == "TASK"):
        return True
    else:
        return False
 
 
# create a new cluster by choosing different InstanceType.
def create_cluster(event):
    # instanceFleetType cloud be CORE, MASTER OR TASK
    instanceFleetType = event["detail"]["instanceFleetType"]
 
    # the following two lines assumes that the customer that created the cluster already knows which instance types they use in original request
    instanceTypesFromOriginalRequestMaster = "m5.xlarge"
    instanceTypesFromOriginalRequestCore = "m5.xlarge"
   
    # select new instance types to include in the new createCluster request
    instanceTypesForTask = [
        "m5.xlarge",
        "m5.2xlarge",
        "m5.4xlarge",
        "m5.8xlarge",
        "m5.12xlarge"
    ]
    
    print("Starting to create cluster...")
    instances = {
        "InstanceFleets": [
            {
                "InstanceFleetType":"MASTER",
                "TargetOnDemandCapacity":1,
                "TargetSpotCapacity":0,
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesFromOriginalRequestMaster,
                        "WeightedCapacity":1,
                    }
                ]
            },
            {
                "InstanceFleetType":"CORE",
                "TargetOnDemandCapacity":1,
                "TargetSpotCapacity":0,
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesFromOriginalRequestCore,
                        "WeightedCapacity":1,
                    }
                ]
            },
            {
                "InstanceFleetType":"TASK",
                "TargetOnDemandCapacity":0,
                "TargetSpotCapacity":100,
                "LaunchSpecifications":{},
                "InstanceTypeConfigs":[
                    {
                        'InstanceType': instanceTypesForTask[0],
                        "WeightedCapacity":1,
                    },
                    {
                        'InstanceType': instanceTypesForTask[1],
                        "WeightedCapacity":2,
                    },
                    {
                        'InstanceType': instanceTypesForTask[2],
                        "WeightedCapacity":4,
                    },
                    {
                        'InstanceType': instanceTypesForTask[3],
                        "WeightedCapacity":8,
                    },
                    {
                        'InstanceType': instanceTypesForTask[4],
                        "WeightedCapacity":12,
                    }
                ],
                "ResizeSpecifications": {
                    "SpotResizeSpecification": {
                        "TimeoutDurationMinutes": 30
                    }
                }
            }
        ]
    }
    response = CLIENT.run_job_flow(
        Name="Test Cluster",
        Instances=instances,
        VisibleToAllUsers=True,
        JobFlowRole="EMR_EC2_DefaultRole",
        ServiceRole="EMR_DefaultRole",
        ReleaseLabel="emr-6.10.0",
    )
 
    return response["JobFlowId"]
 
 
# terminated the cluster using clusterId received in an event
def terminate_cluster(event):
    print("Trying to terminate cluster, clusterId: " + event["detail"]["clusterId"])
    response = CLIENT.terminate_job_flows(JobFlowIds=[event["detail"]["clusterId"]])
    print(f"Terminate cluster response: {response}")
 
 
def describe_cluster(event):
    response = CLIENT.describe_cluster(ClusterId=event["detail"]["clusterId"])
    return response
 
 
def lambda_handler(event, context):
    if is_spot_provisioning_timeout_event(event):
        print(
            "Received spot provisioning timeout event for instanceFleet, clusterId: "
            + event["detail"]["clusterId"]
        )
 
        describeClusterResponse = describe_cluster(event)
 
        shouldTerminateCluster = is_cluster_eligible_for_termination(
            event, describeClusterResponse
        )
        if shouldTerminateCluster:
            terminate_cluster(event)
 
            clusterId = create_cluster(event)
            print("Created a new cluster, clusterId: " + clusterId)
        else:
            print(
                "Cluster is not eligible for termination, clusterId: "
                + event["detail"]["clusterId"]
            )
 
    else:
        print("Received event is not spot provisioning timeout event, skipping")
```

# 将 Ganglia 与 Amazon EMR 结合使用查看集群应用程序指标


Ganglia 可用于 4.2 到 6.15 之间的 Amazon EMR 发行版。Ganglia 是一个开源项目 (可扩展的分布式系统)。旨在监控集群和网格，同时尽量减少对其性能的影响。当您在集群上启用 Ganglia 时，您可以生成报告并查看整个集群的性能，还可以检查单个节点实例的性能。还配置 Ganglia 以提取和可视化 Hadoop 和 Spark 指标。有关更多信息，请参阅《Amazon EMR 版本指南》**中的 [Ganglia](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-ganglia.html)。

# 使用记录 Amazon EMR API 调用 Amazon CloudTrail
CloudTrail 日志

Amazon EMR 与一项服务集成 [Amazon CloudTrail](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)，该服务提供用户、角色或角色所采取的操作的记录。 Amazon Web Services 服务 CloudTrail 将 Amazon EMR 的所有 API 调用捕获为事件。捕获的调用包括来自 Amazon EMR 控制台的调用和对 EMR API 操作的代码调用。 Amazon 使用收集的信息 CloudTrail，您可以确定向 Amazon EMR 发出的请求、发出请求的 IP 地址、发出请求的时间以及其他详细信息。

每个事件或日志条目都包含有关生成请求的人员信息。身份信息有助于您确定以下内容：
+ 请求是使用根用户凭证还是用户凭证发出的。
+ 请求是否代表 IAM Identity Center 用户发出。
+ 请求是使用角色还是联合用户的临时安全凭证发出的。
+ 请求是否由其他 Amazon Web Services 服务发出。

CloudTrail 在您创建账户 Amazon Web Services 账户 时在您的账户中处于活动状态，并且您自动可以访问 CloudTrail **活动历史记录**。 CloudTrail **事件历史记录**提供了过去 90 天中记录的管理事件的可查看、可搜索、可下载且不可变的记录。 Amazon Web Services 区域有关更多信息，请参阅《*Amazon CloudTrail 用户指南》*中的 “[使用 CloudTrail 事件历史记录](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/view-cloudtrail-events.html)”。查看**活动历史记录**不 CloudTrail收取任何费用。

要持续记录 Amazon Web Services 账户 过去 90 天内的事件，请创建跟踪或 [CloudTrailLake](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-lake.html) 事件数据存储。

**CloudTrail 步道**  
*跟踪*允许 CloudTrail 将日志文件传输到 Amazon S3 存储桶。使用创建的所有跟踪 Amazon Web Services 管理控制台 都是多区域的。您可以通过使用 Amazon CLI创建单区域或多区域跟踪。建议创建多区域跟踪，因为您可以捕获账户 Amazon Web Services 区域 中的所有活动。如果您创建单区域跟踪，则只能查看跟踪的 Amazon Web Services 区域中记录的事件。有关跟踪的更多信息，请参阅《Amazon CloudTrail 用户指南》**中的[为您的 Amazon Web Services 账户创建跟踪](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-create-and-update-a-trail.html)和[为组织创建跟踪](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/creating-trail-organization.html)。  
通过创建跟踪，您可以免费将正在进行的管理事件的一份副本传送到您的 Amazon S3 存储桶，但会收取 Amazon S3 存储费用。 CloudTrail 有关 CloudTrail 定价的更多信息，请参阅[Amazon CloudTrail 定价](https://www.amazonaws.cn/cloudtrail/pricing/)。有关 Amazon S3 定价的信息，请参阅 [Amazon S3 定价](https://www.amazonaws.cn/s3/pricing/)。

**CloudTrail 湖泊事件数据存储**  
CloudTrail L@@ *ak* e 允许你对自己的事件运行基于 SQL 的查询。 CloudTrail Lake 将基于行的 JSON 格式的现有事件转换为 [Apache ORC](https://orc.apache.org/) 格式。ORC 是一种针对快速检索数据进行优化的列式存储格式。事件将被聚合到*事件数据存储*中，它是基于您通过应用[高级事件选择器](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-lake-concepts.html#adv-event-selectors)选择的条件的不可变的事件集合。应用于事件数据存储的选择器用于控制哪些事件持续存在并可供您查询。有关 CloudTrail Lake 的更多信息，请参阅《*Amazon CloudTrail 用户指南》*中的 “[使用 Amazon CloudTrail Lake](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-lake.html)”。  
CloudTrail 湖泊事件数据存储和查询会产生费用。创建事件数据存储时，您可以选择要用于事件数据存储的[定价选项](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-lake-manage-costs.html#cloudtrail-lake-manage-costs-pricing-option)。定价选项决定了摄取和存储事件的成本，以及事件数据存储的默认和最长保留期。有关 CloudTrail 定价的更多信息，请参阅[Amazon CloudTrail 定价](https://www.amazonaws.cn/cloudtrail/pricing/)。

## Amazon 中的 EMR 数据事件 CloudTrail


[数据事件](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events)可提供对资源或在资源中所执行资源操作（例如，读取或写入 Amazon S3 对象）的相关信息。这些也称为数据面板操作。数据事件通常是高容量活动。默认情况下， CloudTrail 不记录数据事件。 CloudTrail **事件历史**记录不记录数据事件。

记录数据事件将收取额外费用。有关 CloudTrail 定价的更多信息，请参阅[Amazon CloudTrail 定价](https://www.amazonaws.cn/cloudtrail/pricing/)。

您可以使用 CloudTrail 控制台、 Amazon CLI或 CloudTrail API 操作记录 Amazon EMR 资源类型的数据事件。有关如何记录数据事件的更多信息，请参阅《Amazon CloudTrail 用户指南》**中的[使用 Amazon Web Services 管理控制台记录数据事件](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#logging-data-events-console)和[使用 Amazon Command Line Interface记录数据事件](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html#creating-data-event-selectors-with-the-AWS-CLI)。

下表列出了您可以记录数据事件的 Amazon EMR 资源类型。**数据事件类型（控制台）**列显示要从控制 CloudTrail 台上的**数据事件类型**列表中选择的值。res **ources.type 值**列显示该`resources.type`值，您将在使用或配置高级事件选择器时指定该值。 Amazon CLI CloudTrail APIs“** APIs 记录到的数据 CloudTrail**” 列显示了 CloudTrail 针对该资源类型记录的 API 调用。

有关这些 API 操作的更多信息，请参阅 [Amazon EMR WAL（EMRWAL）CLI 参考](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emrwalcli-ref.html)。Amazon EMR 记录了一些数据 API 操作 CloudTrail ，这些操作是您从不直接调用的 HBase 系统操作。EMRWAL CLI 参考中没有这些操作。


| 数据事件类型（控制台） | resources.type 值 | 数据 APIs 已记录到 CloudTrail | 
| --- | --- | --- | 
| Amazon EMR 预写日志 Workspace |  AWS::EMRWAL::Workspace  |  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/logging-using-cloudtrail.html)  | 

您可以将高级事件选择器配置为在 `eventName`、`readOnly` 和 `resources.ARN` 字段上进行筛选，从而仅记录那些对您很重要的事件。有关这些字段的更多信息，请参阅《Amazon CloudTrail API 参考》**中的 [https://docs.amazonaws.cn/awscloudtrail/latest/APIReference/API_AdvancedFieldSelector.html](https://docs.amazonaws.cn/awscloudtrail/latest/APIReference/API_AdvancedFieldSelector.html)。

## Amazon 中的 EMR 管理事件 CloudTrail


[管理事件](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/logging-management-events-with-cloudtrail.html#logging-management-events)提供有关对中的资源执行的管理操作的信息 Amazon Web Services 账户。这些也称为控制面板操作。默认情况下， CloudTrail 记录管理事件。

Amazon EMR 将所有 Amazon EMR 控制平面操作记录为管理事件。[有关 EMR 记录到的 Amazon EMR 控制平面操作的列表， CloudTrail请参阅 Amazon EMR API 参考。Amazon](https://docs.amazonaws.cn/emr/latest/APIReference/Welcome.html)

## Amazon EMR 事件示例


事件代表来自任何来源的单个请求，包括有关所请求的 API 操作、操作的日期和时间、请求参数等的信息。 CloudTrail 日志文件不是公共 API 调用的有序堆栈跟踪，因此事件不会按任何特定顺序出现。

以下示例显示了演示该**RunJobFlow**操作的 CloudTrail 日志条目。

```
{
	"Records": [
	{
         "eventVersion":"1.01",
         "userIdentity":{
            "type":"IAMUser",
            "principalId":"EX_PRINCIPAL_ID",
            "arn":"arn:aws:iam::123456789012:user/temporary-user-xx-7M",
            "accountId":"123456789012",
            "userName":"temporary-user-xx-7M"
         },
         "eventTime":"2018-03-31T17:59:21Z",
         "eventSource":"elasticmapreduce.amazonaws.com",
         "eventName":"RunJobFlow",
         "awsRegion":"us-west-2",
         "sourceIPAddress":"192.0.2.1",
         "userAgent":"aws-sdk-java/unknown-version Linux/xx Java_HotSpot(TM)_64-Bit_Server_VM/xx",
         "requestParameters":{
            "tags":[
               {
                  "value":"prod",
                  "key":"domain"
               },
               {
                  "value":"us-west-2",
                  "key":"realm"
               },
               {
                  "value":"VERIFICATION",
                  "key":"executionType"
               }
            ],
            "instances":{
               "slaveInstanceType":"m5.xlarge",
               "ec2KeyName":"emr-integtest",
               "instanceCount":1,
               "masterInstanceType":"m5.xlarge",
               "keepJobFlowAliveWhenNoSteps":true,
               "terminationProtected":false
            },
            "visibleToAllUsers":false,
            "name":"MyCluster",
            "ReleaseLabel":"emr-5.16.0"
         },
         "responseElements":{
            "jobFlowId":"j-2WDJCGEG4E6AJ"
         },
         "requestID":"2f482daf-b8fe-11e3-89e7-75a3d0e071c5",
         "eventID":"b348a38d-f744-4097-8b2a-e68c9b424698"
      },
	...additional entries
  ]
}
```

有关 CloudTrail 录音内容的信息，请参阅《*Amazon CloudTrail 用户指南》*中的[CloudTrail录制内容](https://docs.amazonaws.cn/awscloudtrail/latest/userguide/cloudtrail-event-reference-record-contents.html)。

# EMR Observability 最佳实践


EMR 可观察性包括对 EM Amazon R 集群的全面监控和管理方法。其基础是亚马逊 CloudWatch 作为主要的监控服务，再加上EMR Studio以及Prometheus和Grafana等第三方工具，以提高知名度。本文将探讨集群可观测性的具体方面：

1. *[Spark 可观察性](https://github.com/aws/aws-emr-best-practices/blob/main/website/docs/bestpractices/Applications/Spark/observability.md)* (GitHub) — 关于 Spark 用户界面，亚马逊 EMR 中有三个选项。

1. *[Spark 故障排除](https://github.com/aws/aws-emr-best-practices/blob/main/website/docs/bestpractices/Applications/Spark/troubleshooting.md)* (GitHub)-错误解决方案。

1. *[EMR 集群监控](https://aws.github.io/aws-emr-best-practices/docs/bestpractices/Observability/best_practices/)* (GitHub)-监控集群性能。

1. *[EMR 疑难解答](https://github.com/aws/aws-emr-best-practices/blob/main/website/docs/bestpractices/Troubleshooting/Troubleshooting%20EMR.md)* (GitHub)-识别、诊断和解决常见的 EMR 集群问题。

1. *[成本优化](https://github.com/aws/aws-emr-best-practices/blob/main/website/docs/bestpractices/Cost%20Optimizations/best_practices.md)* (GitHub) — 本节概述了运行经济高效的工作负载的最佳实践。

## 适用于 Apache Spark 应用程序的性能优化工具


1. [Amazon EMR Advisor](https://github.com/aws-samples/aws-emr-advisor) 工具分析 Spark 事件日志，为优化 EMR 集群配置、提高性能和降低成本提供量身定制的建议。通过利用历史数据，它建议了理想的执行程序大小和基础设施设置，从而提高资源利用率并提高整体集群性能。

1. [Amazon CodeGuru Profiler](https://github.com/amzn/amazon-codeguru-profiler-for-spark) 工具通过收集和分析运行时数据，帮助开发人员识别 Spark 应用程序中的性能瓶颈和效率低下。该工具可与现有 Spark 应用程序无缝集成，只需最少的设置，并通过 Amazon 控制台提供有关 CPU 使用率、内存模式和性能热点的详细见解。

# 使用 Amazon EMR 集群扩展来适应不断变化的工作负载


您可以自动或手动调整对 Amazon EMR 集群可用的 Amazon EC2 实例的数目，以满足各种工作负载的不同需求。要使用自动扩展，您有两个选项。您可以启用 Amazon EMR 托管扩展或创建自定义自动扩展策略。下表介绍了两个选项之间的区别。


|  | Amazon EMR 托管扩展 | 自定义自动扩展 | 
| --- | --- | --- | 
|  扩展策略和规则  |  无需策略。Amazon EMR 通过持续评估集群指标并做出优化的扩展决策来管理自动扩缩活动。  |  您需要定义和管理自动伸缩策略和规则，如触发扩缩活动的特定条件、评估期、冷却时间等。  | 
|  支持的 Amazon EMR 发行版  |  Amazon EMR 版本 5.30.0 及更高版本（Amazon EMR 版本 6.0.0 除外）  |  Amazon EMR 版本 4.0.0 及更高版本  | 
|  支持的集群构成  | 实例组或实例队列 |  仅实例组  | 
| 扩展限制配置 |  为整个集群配置扩展限制。  |  只能为每个实例组配置扩展限制。  | 
|  指标评估频率   |  每 5 到 10 秒一次 更频繁地评估指标使 Amazon EMR 能够做出更精确的扩展决策。  |  您只能以五分钟的增量定义评估期。  | 
|  受支持的应用程序  |  只支持 YARN 应用程序，如 Spark、Hadoop、Hive、Flink。Amazon EMR 托管扩展不支持不基于 YARN 的应用程序，例如 Presto 或。 HBase  |  在定义自动扩展规则时，您可以选择支持哪些应用程序。  | 

## 注意事项

+ 一个 Amazon EMR 集群始终由一个或三个主节点组成。首次配置集群后，您只能扩展核心节点和任务节点，而无法扩展集群的主节点数量。
+ 对于实例组，重新配置操作和大小调整操作是依次进行的，而不是同时进行的。如果您在调整实例组大小时发起重新配置，则实例组完成正在进行的大小调整后，将会立即开始重新配置。相反，如果您在实例组忙于重新配置时启动调整大小操作，则调整大小操作将在重新配置完成后开始。

# 在 Amazon EMR 中使用托管扩展
托管扩展

**重要**  
我们强烈建议您使用最新的亚马逊 EMR 版本（亚马逊 EMR 7.12.0）进行托管扩展。在某些早期的发行版中，您可能会遇到间歇性的应用程序故障或扩展延迟。Amazon EMR 已通过 5.x 发行版 5.30.2、5.31.1、5.32.1、5.33.1 及更高版本，以及 6.x 发行版 6.1.1、6.2.1、6.3.1 及更高版本解决了此问题。有关区域和发行版可用性的更多信息，请参阅 [托管式自动扩缩功能的可用性](#emr-managed-scaling-availability)。

## 概述


使用 Amazon EMR 版本 5.30.0 及更高版本（Amazon EMR 6.0.0 除外），您可以启用 Amazon EMR 托管式自动扩缩功能。托管扩展让您根据工作负载自动增加或减少集群中实例或单元的数量。Amazon EMR 会持续评估集群指标，以便做出扩展决策，从而优化集群的成本和速度。托管扩展适用于由实例组或实例队列组成的集群。

## 托管式自动扩缩功能的可用性
可用性
+ 在下文中 Amazon Web Services 区域，亚马逊 EMR 6.14.0 及更高版本支持亚马逊 EMR 托管扩展：
  + 亚太地区（台北）（ap-east-2）
  + 亚太地区（墨尔本）(ap-southeast-4)
  + 亚太地区（马来西亚）（ap-southeast-5）
  + 亚太地区（新西兰）（ap-southeast-6）
  + 亚太地区（泰国）（ap-southeast-7）
  + 加拿大西部（卡尔加里）（ca-west-1）
  + 欧洲（西班牙）(eu-south-2)
  + 墨西哥（中部）（mx-central-1）
+ 在下文中 Amazon Web Services 区域，亚马逊 EMR 托管扩展适用于亚马逊 EMR 5.30.0 和 6.1.0 及更高版本：
  + 美国东部（弗吉尼亚州北部）（us-east-1）
  + 美国东部（俄亥俄州）(us-east-2)
  + 美国西部（俄勒冈州）(us-west-2)
  + 美国西部（北加利福尼亚）(us-west-1)
  + 非洲（开普敦）(af-south-1)
  + 亚太地区（香港）(ap-east-1)
  + 亚太地区（孟买）(ap-south-1)
  + 亚太地区（海得拉巴）(ap-south-2)
  + 亚太地区（首尔）(ap-northeast-2)
  + 亚太地区（新加坡）(ap-southeast-1)
  + 亚太地区（悉尼）(ap-southeast-2)
  + 亚太地区（雅加达）（ap-southeast-3）
  + 亚太地区（东京）(ap-northeast-1)
  + 亚太地区（大阪）(ap-northeast-3)
  + 加拿大（中部）(ca-central-1)
  + 南美洲（圣保罗）（sa-east-1）
  + 欧洲地区（法兰克福）(eu-central-1)
  + 欧洲（苏黎世）(eu-central-2)
  + 欧洲地区（爱尔兰）(eu-west-1)
  + 欧洲地区（伦敦）(eu-west-2)
  + 欧洲地区（米兰）(eu-south-1)
  + 欧洲（巴黎）（eu-west-3）
  + 欧洲地区（斯德哥尔摩）(eu-north-1)
  + 以色列（特拉维夫）（il-central-1）
  + 中东（阿联酋）(me-central-1)
  + 中国（北京）（cn-north-1）
  + 中国（宁夏）（cn-northwest-1）
  + Amazon GovCloud (美国东部) (us-gov-east-1)
  + Amazon GovCloud (美国西部) (us-gov-west-1)
+ Amazon EMR 托管扩展仅适用于 YARN 应用程序，如 Spark、Hadoop、Hive 和 Flink。它不支持不基于 YARN 的应用程序，例如 Presto 和。 HBase

## 托管扩展参数
参数

您必须为托管扩展配置以下参数。该限制仅适用于核心节点和任务节点。初始配置后，无法扩展主节点。
+ **Minimum (最小)**（`MinimumCapacityUnits`）：集群中允许的 EC2 容量的下限。其衡量方式为通过虚拟中央处理单位（vCPU）核心或实例组中的实例进行衡量。其衡量方式为通过实例集单位进行衡量。
+ **Maximum (最大)**（`MaximumCapacityUnits`）：集群中允许的 EC2 容量的上限。其衡量方式为通过虚拟中央处理单位（vCPU）核心或实例组中的实例进行衡量。其衡量方式为通过实例集单位进行衡量。
+ **On-Demand limit (按需限制)**（`MaximumOnDemandCapacityUnits`）（可选）：集群中按需市场类型允许的 EC2 容量的上限。如果未指定此参数，则默认为 `MaximumCapacityUnits` 的值。
  + 此参数用于在按需实例和竞价型实例之间拆分容量分配。例如，如果您将最小参数设置为 2 个实例，最大参数设置为 100 个实例，按需限制设置为 10 个实例，则 Amazon EMR 托管扩展将纵向扩展到 10 个按需型实例，并将剩余容量分配给竞价型实例。有关更多信息，请参阅 [节点分配方案](managed-scaling-allocation-strategy.md#node-allocation-scenarios)。
+ **Maximum core nodes (最大核心节点)**（`MaximumCoreCapacityUnits`）（可选）：集群中核心节点类型允许的 EC2 容量的上限。如果未指定此参数，则默认为 `MaximumCapacityUnits` 的值。
  + 此参数用于在核心节点和任务节点之间分配容量。例如，如果您将最小参数设置为 2 个实例，最大参数设置为 100 个实例，最大核心节点设置为 17 个实例，则 Amazon EMR 托管扩展将纵向扩展到 17 个核心节点，并将剩余的 83 个实例分配给任务节点。有关更多信息，请参阅 [节点分配方案](managed-scaling-allocation-strategy.md#node-allocation-scenarios)。

有关托管式扩展参数的更多信息，请参阅 [https://docs.amazonaws.cn/emr/latest/APIReference/API_ComputeLimits.html](https://docs.amazonaws.cn/emr/latest/APIReference/API_ComputeLimits.html)。

## Amazon EMR 托管式自动扩缩功能注意事项
注意事项
+ 有限版本 Amazon Web Services 区域 和 Amazon EMR 版本支持托管扩展。有关更多信息，请参阅 [托管式自动扩缩功能的可用性](#emr-managed-scaling-availability)。
+ 您必须为 Amazon EMR 托管扩展配置所需参数。有关更多信息，请参阅 [托管扩展参数](#emr-managed-scaling-parameters)。
+ 要使用托管式扩展，指标收集器进程必须能够连接到公有 API 端点，以便在 API Gateway 中进行托管式扩展。如果您将私有 DNS 名称与一起使用 Amazon Virtual Private Cloud，则托管扩展将无法正常运行。为确保托管式扩展正常运行，我们建议您执行以下操作之一：
  + 从您的 Amazon VPC 中删除 API Gateway 接口 VPC 终端节点。
  + 请按照[为什么从 VPC 连接我的 API Gateway 时会出现 HTTP 403 禁止错误？ APIs 中的说明进行](https://www.amazonaws.cn/premiumsupport/knowledge-center/api-gateway-vpc-connections/)操作 禁用私有 DNS 名称设置。
  + 在您的私有子网中启动集群。有关更多信息，请参阅 [私有子网](emr-clusters-in-a-vpc.md#emr-vpc-private-subnet) 中的主题。
+ 如果您的 YARN 作业在缩减过程中出现间歇性运行缓慢的情况，并且 YARN 资源管理器日志显示在此期间您的大多数节点都被列入拒绝列表，则可以调整停用超时阈值。

  将 `spark.blacklist.decommissioning.timeout` 从 1 小时减少到 1 分钟，以使节点可供其他待处理容器继续进行任务处理。

  您还应将 `YARN.resourcemanager.nodemanager-graceful-decommission-timeout-secs` 设置为更大的值，以确保当时间最长的“Spark 任务”仍在节点上运行时，Amazon EMR 不会强制终止该节点。当前默认值为 60 分钟，这意味着一旦节点进入停用状态，YARN 将在 60 分钟后强制终止容器。

  以下 YARN 资源管理器日志行示例显示了已添加到停用状态的节点：

  ```
  2021-10-20 15:55:26,994 INFO org.apache.hadoop.YARN.server.resourcemanager.DefaultAMSProcessor (IPC Server handler 37 on default port 8030): blacklist are updated in Scheduler.blacklistAdditions: [ip-10-10-27-207.us-west-2.compute.internal, ip-10-10-29-216.us-west-2.compute.internal, ip-10-10-31-13.us-west-2.compute.internal, ... , ip-10-10-30-77.us-west-2.compute.internal], blacklistRemovals: []
  ```

  查看 [details on how Amazon EMR integrates with YARN deny listing during decommissioning of nodes](https://www.amazonaws.cn/blogs/big-data/spark-enhancements-for-elasticity-and-resiliency-on-amazon-emr/)（有关 Amazon EMR 如何在节点停用期间与 YARN 拒绝名单集成的详细信息）、[拒绝列出的节点](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-troubleshoot-error-resource-3.html)以及[配置节点停用行为](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/emr-spark-configure.html#spark-decommissioning)的更多信息。
+ 对于 Spark 工作负载，通过将 Spark 属性 **spark.dynamicAllocation.enabled** 更改为 `FALSE` 来禁用 Spark 动态资源分配器 (DRA) 可能会导致托管扩展问题，在这种情况下，集群可能会扩展到超出工作负载所需的量（直至达到最大计算量）。当对这些工作负载使用托管扩展时，建议您保持启用 Spark DRA，这是此属性的默认状态。
+ 过度使用 EBS 卷可能会导致托管扩展问题。我们建议您将 EBS 卷的利用率保持在 90％ 以下。有关更多信息，请参阅 [Amazon EMR 中的实例存储选项和行为](emr-plan-storage.md)。
+ 亚马逊 CloudWatch 指标对于 Amazon EMR 托管扩展的运作至关重要。我们建议您密切监控 Amazon CloudWatch 指标，确保数据不会丢失。有关如何配置 CloudWatch 警报以检测缺失指标的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。
+ 在未安装 Presto 的 5.30.0 和 5.30.1 的集群上进行托管扩展操作可能会导致应用程序故障或导致统一的实例组或实例集处于 `ARRESTED` 状态，尤其是在缩减操作之后快速执行扩展操作时。

  解决方法是即使您的任务不需要 Presto，也可以在使用 Amazon EMR 发行版 5.30.0 和 5.30.1 创建集群时，将 Presto 选为要安装的应用程序。
+ 在为 Amazon EMR 托管扩展设置最大核心节点和按需限制时，请考虑实例组和实例集之间的差异。每个实例组包含相同的实例类型和相同的实例购买选项：按需或 Spot。对于每个实例集，您可以指定最多 5 个实例类型，这些类型可预配置为按需实例和竞价型实例。有关更多信息，请参阅[使用集或统一实例组创建集群](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-instance-group-configuration.html)、[集选项](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-instance-fleet.html#emr-instance-fleet-options)和 [节点分配方案](managed-scaling-allocation-strategy.md#node-allocation-scenarios)。
+ 对于 Amazon EMR 5.30.0 及更高版本，如果您移除主安全组默认的**允许所有**出站规则 0.0.0.0/，则必须添加一条规则，以允许与您的安全组建立出站 TCP 连接，从而在端口 9443 上访问服务。您的服务访问安全组应允许来自主安全组端口 9443 上的入站 TCP 流量。有关配置安全组的更多信息，请参阅[适用于主实例（私有子网）的 Amazon EMR 托管安全组](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-man-sec-groups.html#emr-sg-elasticmapreduce-master-private)。
+ 您可以使用 Amazon CloudFormation 来配置 Amazon EMR 托管扩展。有关更多信息，请参阅《Amazon CloudFormation 用户指南》**中的 [AWS::EMR::Cluster](https://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html)。
+ 如果您使用的是竞价型节点，请考虑使用节点标签来防止 Amazon EMR 在 Amazon EMR 删除竞价型节点时删除应用程序进程。有关节点标签的更多信息，请参阅[任务节点](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-master-core-task-nodes.html#emr-plan-task)。
+ Amazon EMR 6.15 或更低版本默认不支持节点标签。有关更多信息，请参阅[了解节点类型：主节点、核心节点和任务节点。](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)。
+ 如果您使用的是 Amazon EMR 6.15 或更低版本，则只能按节点类型分配节点标签，比如核心节点和任务节点。但是，如果您使用的是 Amazon EMR 7.0 或更高版本，则可以按节点类型和市场类型配置节点标签，比如按需型和竞价型。
+ 如果将应用程序进程限制为核心节点时，应用程序进程需求增加而执行程序需求减少，则可以在同一调整大小操作中重新添加核心节点并删除任务节点。有关更多信息，请参阅[了解节点分配策略和场景](https://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)。
+ Amazon EMR 不会标记任务节点，所以您不能设置 YARN 属性来限制应用程序进程仅用于任务节点。但如果要使用市场类型作为节点标签，则可以使用 `ON_DEMAND` 或 `SPOT` 标签来放置应用程序进程。建议不要在应用程序主进程中使用竞价型节点。
+ 使用节点标签时，当 Amazon EMR 停用某些实例时，集群中的总运行单位可能会暂时超过托管扩展策略中设置的最大计算量。请求的总单位数将始终保持在或低于策略的最大计算量。
+ 托管扩展仅支持节点标签 `ON_DEMAND` 和 `SPOT` 或 `CORE` 和 `TASK`。不支持自定义节点标签。
+ Amazon EMR 会在创建集群和预置资源时创建节点标签。Amazon EMR 不支持在重新配置集群时添加节点标签。启动集群后配置托管扩展时，您也不能修改节点标签。
+ 托管扩展可根据应用程序进程和执行程序需求独立扩展核心节点和任务节点。为防止核心节点缩减时出现 HDFS 数据丢失问题，请遵循核心节点的标准做法。要了解有关核心节点和 HDFS 复制的最佳实践的更多信息，请参阅[注意事项和最佳实践](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-ha-considerations.html)。
+ 不能将应用程序进程和执行程序都放置在 `core` 或 `ON_DEMAND` 节点上。如果要在其中一个节点上同时添加应用程序进程和执行程序，请不要使用 `yarn.node-labels.am.default-node-label-expression` 配置。

  例如，要将应用程序进程和执行程序都放置在 `ON_DEMAND` 节点中，请将最大计算量设置为与 `ON_DEMAND` 节点中的最大计算量相同。同时删除 `yarn.node-labels.am.default-node-label-expression` 配置。

  要在 `core` 节点上同时添加应用程序进程和执行程序，请删除 `yarn.node-labels.am.default-node-label-expression` 配置。
+  当您在节点标签中使用托管扩展时，如果计划并行运行多个应用程序，请设置属性 `yarn.scheduler.capacity.maximum-am-resource-percent: 1`。这样可确保您的应用程序进程充分利用可用的 `CORE` 或 `ON_DEMAND` 节点。
+  当您在节点标签中使用托管扩展时，请将属性 `yarn.resourcemanager.decommissioning.timeout` 设置为比集群中运行时间最长的应用程序更长的值。这样减少了 Amazon EMR 托管扩展需要重新安排应用程序以重新调试 `CORE` 或 `ON_DEMAND` 节点的可能性。
+ 为了降低因随机数据丢失而导致应用程序失败的风险，Amazon EMR 会从集群收集指标，以确定哪些节点具有来自当前阶段和上一阶段的现有瞬态随机排序数据。在极少数情况下，指标可能会继续报告已完成或已终止的应用程序的过时数据。这可能会影响集群中实例的及时缩减。对于拥有大量随机排序数据的集群，请考虑使用 EMR 6.13 及更高版本。

## 功能历史记录


此表列出了对 Amazon EMR 托管扩展功能的更新。


| 发行日期 | 能力 | Amazon EMR 版本 | 
| --- | --- | --- | 
| 2024 年 11 月 20 日 | 托管扩展在 il-central-1 以色列（特拉维夫）、me-central-1 中东（阿联酋）和 ap-northeast-3 亚太地区（大阪）区域可用。 | 5.30.0 和 6.1.0 及更高版本 | 
| 2024 年 11 月 15 日 | 托管扩展在 eu-central-2 欧洲（苏黎世）区域可用。 | 5.30.0 和 6.1.0 及更高版本 | 
| 2024 年 8 月 20 日 | 节点标签现已在托管扩展中可用，您可以根据市场类型或节点类型为实例添加标签，以改善自动扩展。 | 7.2.0 及更高版本 | 
| 2024 年 3 月 31 日 | 托管扩展在 ap-south-2 亚太地区（海得拉巴）区域推出。 | 6.14.0 及更高版本 | 
| 2024 年 2 月 13 日 | 托管扩展在 eu-south-2 欧洲（西班牙）区域推出。 | 6.14.0 及更高版本 | 
| 2023 年 10 月 10 日 | 托管式自动扩缩功能已在 ap-southeast-3 亚太地区（雅加达）区域开放。 | 6.14.0 及更高版本 | 
| 2023 年 7 月 28 日 | 增强了托管扩展，以便在 Amazon EMR 在纵向扩展当前实例组的过程中遇到延迟时，可以在纵向扩展时切换到不同的任务实例组。 | 5.34.0 及更高版本，6.4.0 及更高版本 | 
| 2023 年 6 月 16 日 | 增强了托管扩展，以了解运行应用程序主节点的节点，这样这些节点就不会被缩减。有关更多信息，请参阅 [了解 Amazon EMR 节点分配策略和场景](managed-scaling-allocation-strategy.md)。 | 5.34.0 及更高版本，6.4.0 及更高版本 | 
| 2022 年 3 月 21 日 | 添加了在缩减集群时使用的 Spark 随机排序数据感知。对于启用了 Apache Spark 和托管式扩展功能的 Amazon EMR 集群，Amazon EMR 会持续监控 Spark 执行程序和中间随机排序数据位置。利用这些信息，Amazon EMR 只能缩减不包含积极使用的随机排序数据的未充分利用的实例。这可以防止重新计算丢失的随机排序数据，从而有助于降低成本和提高任务性能。有关更多信息，请参阅 [Spark Programming Guide](https://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations)（Spark 编程指南）。 | 5.34.0 及更高版本，6.4.0 及更高版本 | 

# 为 Amazon EMR 配置托管扩展
配置托管扩展

以下各节介绍如何启动使用托管扩展的 EMR 集群 Amazon Web Services 管理控制台 适用于 Java 的 Amazon SDK、或。 Amazon Command Line Interface

**Topics**
+ [

## 使用 Amazon Web Services 管理控制台 来配置托管扩展
](#managed-scaling-console)
+ [

## 使用 Amazon CLI 来配置托管扩展
](#managed-scaling-cli)
+ [

## 用于配置 适用于 Java 的 Amazon SDK 托管扩展
](#managed-scaling-sdk)

## 使用 Amazon Web Services 管理控制台 来配置托管扩展
Amazon Web Services 管理控制台

您可以在创建集群时使用 Amazon EMR 控制台配置托管式扩缩，也可更改正在运行的集群的托管式扩缩策略。

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

**使用控制台创建集群时配置托管扩展**

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

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

1. 选择 Amazon EMR 发行版 **emr-5.30.0** 或更高版本（**emr-6.0.0** 版本除外）。

1. 在 **Cluster scaling and provisioning option**（集群扩展和预置选项）下，选择 **Use EMR-managed scaling**（使用 EMR 托管扩展）。指定**最小**和**最大**实例数、**最大核心节点**实例数和**最大按需型**实例数。

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

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

**使用控制台在现有集群上配置托管扩展**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。

1. 在集群详细信息页面的 **Instances**（实例）选项卡上，找到 **Instance group settings**（实例组设置）部分。选择**编辑集群扩展**，为**最小**和**最大**实例数以及**按需**限制指定新值。

------

## 使用 Amazon CLI 来配置托管扩展
Amazon Command Line Interface

创建集群时，您可以使用 Amazon EMR Amazon CLI 命令配置托管扩展。您可以使用速记语法 (可在相关命令中指定内联 JSON 配置)。也可以引用包含配置 JSON 的文件。您也可以将托管扩展策略应用于现有集群，并删除以前应用的托管扩展策略。此外，您可以从正在运行的集群中检索扩展策略配置的详细信息。

**在集群启动期间启用托管扩展**

您可以在集群启动期间启用托管扩展，如以下示例所示。

```
aws emr create-cluster \
 --service-role EMR_DefaultRole \
 --release-label emr-7.12.0 \
 --name EMR_Managed_Scaling_Enabled_Cluster \
 --applications Name=Spark Name=Hbase \
 --ec2-attributes KeyName=keyName,InstanceProfile=EMR_EC2_DefaultRole \
 --instance-groups InstanceType=m4.xlarge,InstanceGroupType=MASTER,InstanceCount=1 InstanceType=m4.xlarge,InstanceGroupType=CORE,InstanceCount=2 \
 --region us-east-1 \
 --managed-scaling-policy ComputeLimits='{MinimumCapacityUnits=2,MaximumCapacityUnits=4,UnitType=Instances}'
```

使用时，也可以使用--managed-scaling-policy 选项指定托管策略配置`create-cluster`。

**将托管扩展策略应用于现有集群**

您可以将托管扩展策略应用于现有集群，如以下示例所示。

```
aws emr put-managed-scaling-policy  
--cluster-id j-123456  
--managed-scaling-policy ComputeLimits='{MinimumCapacityUnits=1,
MaximumCapacityUnits=10,  MaximumOnDemandCapacityUnits=10, UnitType=Instances}'
```

也可以使用 `aws emr put-managed-scaling-policy` 命令将托管扩展策略应用于现有集群。以下示例使用对 JSON 文件 `managedscaleconfig.json` 的引用，该文件指定托管扩展策略配置。

```
aws emr put-managed-scaling-policy --cluster-id j-123456 --managed-scaling-policy file://./managedscaleconfig.json
```

以下示例显示 `managedscaleconfig.json` 文件的内容，该文件定义托管扩展策略。

```
{
    "ComputeLimits": {
        "UnitType": "Instances",
        "MinimumCapacityUnits": 1,
        "MaximumCapacityUnits": 10,
        "MaximumOnDemandCapacityUnits": 10
    }
}
```

**检索托管扩展策略配置**

`GetManagedScalingPolicy` 命令检索策略配置。例如，以下命令检索集群 ID 为 `j-123456` 的集群的配置。

```
aws emr get-managed-scaling-policy --cluster-id j-123456
```

该命令生成以下示例输出。

```
 1. {
 2.    "ManagedScalingPolicy": { 
 3.       "ComputeLimits": { 
 4.          "MinimumCapacityUnits": 1,
 5.          "MaximumOnDemandCapacityUnits": 10,
 6.          "MaximumCapacityUnits": 10,
 7.          "UnitType": "Instances"
 8.       }
 9.    }
10. }
```

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

**删除托管扩展策略**

`RemoveManagedScalingPolicy` 命令可删除策略配置。例如，以下命令删除集群 ID 为 `j-123456` 的集群的配置。

```
aws emr remove-managed-scaling-policy --cluster-id j-123456
```

## 用于配置 适用于 Java 的 Amazon SDK 托管扩展
适用于 Java 的 Amazon SDK

以下程序摘要说明如何使用 适用于 Java 的 Amazon SDK配置托管扩展：

```
package com.amazonaws.emr.sample;

import java.util.ArrayList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduce;
import com.amazonaws.services.elasticmapreduce.AmazonElasticMapReduceClientBuilder;
import com.amazonaws.services.elasticmapreduce.model.Application;
import com.amazonaws.services.elasticmapreduce.model.ComputeLimits;
import com.amazonaws.services.elasticmapreduce.model.ComputeLimitsUnitType;
import com.amazonaws.services.elasticmapreduce.model.InstanceGroupConfig;
import com.amazonaws.services.elasticmapreduce.model.JobFlowInstancesConfig;
import com.amazonaws.services.elasticmapreduce.model.ManagedScalingPolicy;
import com.amazonaws.services.elasticmapreduce.model.RunJobFlowRequest;
import com.amazonaws.services.elasticmapreduce.model.RunJobFlowResult;

public class CreateClusterWithManagedScalingWithIG {

	public static void main(String[] args) {
		AWSCredentials credentialsFromProfile = getCreadentials("AWS-Profile-Name-Here");
		
		/**
		 * Create an Amazon EMR client with the credentials and region specified in order to create the cluster
		 */
		AmazonElasticMapReduce emr = AmazonElasticMapReduceClientBuilder.standard()
			.withCredentials(new AWSStaticCredentialsProvider(credentialsFromProfile))
			.withRegion(Regions.US_EAST_1)
			.build();
		
		/**
		 * Create Instance Groups - Primary, Core, Task
		 */
		InstanceGroupConfig instanceGroupConfigMaster = new InstanceGroupConfig()
				.withInstanceCount(1)
				.withInstanceRole("MASTER")
				.withInstanceType("m4.large")
				.withMarket("ON_DEMAND"); 
				
		InstanceGroupConfig instanceGroupConfigCore = new InstanceGroupConfig()
			.withInstanceCount(4)
			.withInstanceRole("CORE")
			.withInstanceType("m4.large")
			.withMarket("ON_DEMAND");
			
		InstanceGroupConfig instanceGroupConfigTask = new InstanceGroupConfig()
			.withInstanceCount(5)
			.withInstanceRole("TASK")
			.withInstanceType("m4.large")
			.withMarket("ON_DEMAND");

		List<InstanceGroupConfig> igConfigs = new ArrayList<>();
		igConfigs.add(instanceGroupConfigMaster);
		igConfigs.add(instanceGroupConfigCore);
		igConfigs.add(instanceGroupConfigTask);
		
        /**
         *  specify applications to be installed and configured when Amazon EMR creates the cluster
         */
		Application hive = new Application().withName("Hive");
		Application spark = new Application().withName("Spark");
		Application ganglia = new Application().withName("Ganglia");
		Application zeppelin = new Application().withName("Zeppelin");
		
		/** 
		 * Managed Scaling Configuration - 
         * Using UnitType=Instances for clusters composed of instance groups
		 *
         * Other options are: 
         * UnitType = VCPU ( for clusters composed of instance groups)
         * UnitType = InstanceFleetUnits ( for clusters composed of instance fleets)
         **/
		ComputeLimits computeLimits = new ComputeLimits()
				.withMinimumCapacityUnits(1)
				.withMaximumCapacityUnits(20)
				.withUnitType(ComputeLimitsUnitType.Instances);
		
		ManagedScalingPolicy managedScalingPolicy = new ManagedScalingPolicy();
		managedScalingPolicy.setComputeLimits(computeLimits);
		
		// create the cluster with a managed scaling policy
		RunJobFlowRequest request = new RunJobFlowRequest()
	       		.withName("EMR_Managed_Scaling_TestCluster")
	       		.withReleaseLabel("emr-7.12.0")          // Specifies the version label for the Amazon EMR release; we recommend the latest release
	       		.withApplications(hive,spark,ganglia,zeppelin)
	       		.withLogUri("s3://path/to/my/emr/logs")  // A URI in S3 for log files is required when debugging is enabled.
	       		.withServiceRole("EMR_DefaultRole")      // If you use a custom IAM service role, replace the default role with the custom role.
	       		.withJobFlowRole("EMR_EC2_DefaultRole")  // If you use a custom Amazon EMR role for EC2 instance profile, replace the default role with the custom Amazon EMR role.
	       		.withInstances(new JobFlowInstancesConfig().withInstanceGroups(igConfigs)
	       	   		.withEc2SubnetId("subnet-123456789012345")
	           		.withEc2KeyName("my-ec2-key-name") 
	           		.withKeepJobFlowAliveWhenNoSteps(true))    
	       		.withManagedScalingPolicy(managedScalingPolicy);
	   RunJobFlowResult result = emr.runJobFlow(request); 
	   
	   System.out.println("The cluster ID is " + result.toString());
	}
	
	public static AWSCredentials getCredentials(String profileName) {
		// specifies any named profile in .aws/credentials as the credentials provider
		try {
			return new ProfileCredentialsProvider("AWS-Profile-Name-Here")
					.getCredentials(); 
        } catch (Exception e) {
            throw new AmazonClientException(
                    "Cannot load credentials from .aws/credentials file. " +
                    "Make sure that the credentials file exists and that the profile name is defined within it.",
                    e);
        }
	}
	
	public CreateClusterWithManagedScalingWithIG() { }
}
```

# Amazon EMR 的高级扩展
EMR 的高级扩展

从 Amazon EMR on EC2 版本 7.0 开始，您可以利用高级扩展来控制集群的资源利用率。Advanced Scaling 引入了利用率-性能量表，用于根据业务需求调整资源利用率和性能级别。您设置的值决定了您的集群是更多地考虑资源节约还是向上扩展以处理 service-level-agreement (SLA) 敏感的工作负载，其中快速完成至关重要。当调整扩展值时，托管扩展会解释您的意图并智能地进行扩展以优化资源。有关托管扩展的更多信息，请参阅[为 Amazon EMR 配置托管扩展](https://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-configure.html)。

## 高级缩放设置
高级缩放设置

您为高级扩展设置的值会根据您的需求优化集群。值范围为 **1**-**100**。可能的值为 **1**、**25**、**50**、**75** 和 **100**。如果将索引设置为除这些值之外的其他值，则会导致验证错误。

扩展值与资源利用率策略相对应。以下列表定义了其中几个：
+ **利用率优化 [1]**：此设置可防止资源过度预置。当您希望降低成本并优先考虑高效的资源利用率时，请使用较低的值。它会导致集群纵向扩展不太激进。这对于经常出现工作负载峰值并且您不希望资源增长过快的使用案例非常有效。
+ **平衡 [50]**：这可以平衡资源利用率和作业性能。此设置适用于大多数阶段都有稳定运行时的稳定工作负载。它也适用于混合了短期和长期运行阶段的工作负载。如果不确定要选择哪个设置，建议从此设置开始。
+ **性能优化 [100]** - 此策略优先考虑性能。集群会积极纵向扩展，以确保作业快速完成并达到性能目标。性能优化适用于对快速运行时间至关重要的 service-level-agreement (SLA) 敏感工作负载。

**注意**  
可用的中间值在各种策略之间提供中间地带，以便微调集群的高级扩展行为。

## 高级缩放的好处
高级缩放的好处

由于您的环境和要求存在变化（例如，更改数据量、成本目标调整和 SLA 实施等），集群扩展可以帮助您调整集群配置以实现目标。主要优势包括：
+ **增强的精细控制**：引入利用率-性能设置使您能够根据要求轻松调整集群的扩展行为。您可以根据自己的使用模式纵向扩展以满足对计算资源的需求，也可以缩减以节省资源。
+ **改善成本优化**：您可以根据要求选择低利用率值，以便更轻松地实现成本目标。

## 开始使用优化
开始使用优化

**设置和配置**

按照以下步骤设置性能指标并优化扩展策略。

1. 以下命令使用利用率优化的 `[1]` 扩展策略更新现有集群：

   ```
   aws emr put-managed-scaling-policy --cluster-id 'cluster-id' \
    --managed-scaling-policy '{
     "ComputeLimits": {
       "UnitType": "Instances",
       "MinimumCapacityUnits": 1,
       "MaximumCapacityUnits": 2,
       "MaximumOnDemandCapacityUnits": 2,
       "MaximumCoreCapacityUnits": 2
     },
     "ScalingStrategy": "ADVANCED",
     "UtilizationPerformanceIndex": "1"
   }' \
    --region "region-name"
   ```

   属性 `ScalingStrategy` 和 `UtilizationPerformanceIndex` 是新增的，与扩展优化相关。您可以通过在托管扩展策略中为 `UtilizationPerformanceIndex` 属性设置相应的值（1、25、50、75 和 100）来选择不同的扩展策略。

1. 要恢复到默认托管扩展策略，请运行 `put-managed-scaling-policy` 命令，但不要包含 `ScalingStrategy` 和 `UtilizationPerformanceIndex` 属性。（这是可选的。） 以下示例展示了如何执行此操作：

   ```
   aws emr put-managed-scaling-policy \
   --cluster-id 'cluster-id' \
   --managed-scaling-policy '{"ComputeLimits":{"UnitType":"Instances","MinimumCapacityUnits":1,"MaximumCapacityUnits":2,"MaximumOnDemandCapacityUnits":2,"MaximumCoreCapacityUnits":2}}' \
   --region "region-name"
   ```

**使用监控指标跟踪集群利用率**

从 EMR 版本 7.3.0 开始，Amazon EMR 发布了四个与内存和虚拟 CPU 相关的新指标。您可以使用这些指标来衡量各个扩展策略的集群利用率。这些指标适用于任何使用案例，但您可以使用此处提供的详细信息来监控高级扩展。

可用的有用指标包括：
+ **YarnContainersUsedMemoryGBSeconds**— 由 YARN 管理的应用程序消耗的内存量。
+ **YarnContainersTotalMemoryGBSeconds**— 集群内分配给 YARN 的总内存容量。
+ **YarnNodesUsedVCPUSeconds**— 由 YARN 管理的每个应用程序的 VCPU 总秒数。
+ **YarnNodesTotalVCPUSeconds**— 消耗的内存总计 VCPU 秒数，包括 yarn 未准备就绪的时间窗口。

您可以使用 Logs Insight Amazon CloudWatch s 分析资源指标。功能包括一种专门构建的查询语言，可帮助您提取与资源使用和扩展相关的指标。

以下查询可以在 Amazon CloudWatch 控制台中运行，它使用度量数学计算平均内存利用率 (e1)，方法是将消耗内存的运行总和 (e2) 除以总内存的运行总和 (e3)：

```
{
    "metrics": [
        [ { "expression": "e2/e3", "label": "Average Mem Utilization", "id": "e1", "yAxis": "right" } ],
        [ { "expression": "RUNNING_SUM(m1)", "label": "RunningTotal-YarnContainersUsedMemoryGBSeconds", "id": "e2", "visible": false } ],
        [ { "expression": "RUNNING_SUM(m2)", "label": "RunningTotal-YarnContainersTotalMemoryGBSeconds", "id": "e3", "visible": false } ],
        [ "AWS_EMR_ManagedResize", "YarnContainersUsedMemoryGBSeconds", "ACCOUNT_ID", "793684541905", "COMPONENT", "ManagerService", "JOB_FLOW_ID", "cluster-id", { "id": "m1", "label": "YarnContainersUsedMemoryGBSeconds" } ],
        [ ".", "YarnContainersTotalMemoryGBSeconds", ".", ".", ".", ".", ".", ".", { "id": "m2", "label": "YarnContainersTotalMemoryGBSeconds" } ]
    ],
    "view": "timeSeries",
    "stacked": false,
    "region": "region",
    "period": 60,
    "stat": "Sum",
    "title": "Memory Utilization"
}
```

要查询日志，可以在 Amazon 控制台 CloudWatch 中选择。有关为编写查询的更多信息 CloudWatch，请参阅 Amazon Logs 用户指南中的[使用 Lo CloudWatch gs Insights 分析 CloudWatch 日志数据](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/AnalyzingLogData.html)。

下图显示了示例集群的这些指标：

![\[显示利用率统计数据的图表。\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/scaling_graph_EMR.png)


## 注意事项和限制
注意事项和限制
+ 扩展策略的有效性可能因您的工作负载特性和集群配置而异。我们建议您尝试不同的扩展设置，以确定最适合您使用案例的索引值。
+ Amazon EMR 高级扩展尤其适用于批处理工作负载。对于 SQL/数据仓库和流式处理工作负载，我们建议使用默认托管扩展策略以获得最佳性能。
+ 在集群中启用节点标签配置时，不支持 Amazon EMR 高级扩展。如果在集群中同时启用了高级扩展和节点标签配置，则扩展行为就像启用了默认的托管扩展设置一样。
+ 性能优化型扩展策略能够比默认托管扩展策略更长时间地保持高计算资源，从而加快作业执行速度。这种模式优先考虑快速纵向扩展以满足资源需求，从而加快作业完成速度。与默认策略相比，这可能会导致成本更高。
+ 如果集群已经过优化并充分利用，启用高级扩展可能不会带来额外好处。在某些情况下，启用高级扩展可能会导致成本增加，因为工作负载可能会运行更长时间。在这些情况下，我们建议使用默认托管扩展策略，以确保最佳资源分配和成本效益。
+ 在托管扩展环境中，随着设置从性能优化 [**100**] 调整为利用率优化 [**1**]，重点从执行时间转向资源利用率。但是请务必注意，结果可能会因工作负载的性质和集群的拓扑而异。为确保您的使用案例获得最佳效果，强烈建议您使用工作负载测试扩展策略，以确定最合适的设置。
+ 仅**PerformanceUtilizationIndex**接受以下值：
  + **1**
  + **25**
  + **50**
  + **75**
  + **100**

  提交的任何其他值都会导致验证错误。

# 了解 Amazon EMR 节点分配策略和场景
节点分配策略

本部分概述了可用于 Amazon EMR 托管扩展的节点分配策略和常见扩展方案。

## 节点分配策略


Amazon EMR 托管扩展基于以下纵向扩展和缩减策略分配核心节点和任务节点：

**纵向扩展策略 **
+ 对于 Amazon EMR 7.2 及更高版本，托管扩展首先根据节点标签和应用程序进程限制 YARN 属性来添加节点。
+ 对于 Amazon EMR 7.2 及更高版本，如果启用了节点标签并将应用程序进程限制在 `CORE` 节点上，则在应用程序进程需求增加和执行程序需求增加时，Amazon EMR 托管式自动扩缩功能会增加核心节点和任务节点。同样地，如果启用了节点标签并将应用程序进程限制在 `ON_DEMAND` 节点上，则托管扩展会在应用程序进程需求增加时扩展按需型节点，并在执行程序需求增加时扩展竞价型节点。
+ 如果未启用节点标签，则应用程序进程放置不限于任何节点或市场类型。
+ 通过使用节点标签，托管扩展可在同一调整大小操作中纵向扩展和缩减不同的实例组和实例集。例如，在 `instance_group1` 具有 `ON_DEMAND` 节点和 `instance_group2` 具有 `SPOT` 节点的场景中，启用了节点标签，应用程序进程仅限于带有 `ON_DEMAND` 标签的节点。如果应用程序进程需求减少，而执行程序需求增加，则托管扩展将缩减 `instance_group1` 并纵向扩展 `instance_group2`。
+ 当 Amazon EMR 在纵向扩展当前实例组的过程中遇到延迟时，使用托管式扩展的集群会自动切换到不同的任务实例组。
+ 如果设置了 `MaximumCoreCapacityUnits` 参数，则 Amazon EMR 会扩展核心节点，直到核心单位达到所允许的最大限制。所有剩余容量都添加到任务节点。
+ 如果设置了 `MaximumOnDemandCapacityUnits` 参数，则 Amazon EMR 使用按需型实例扩展集群，直到按需型单位达到所允许的最大限制。使用竞价型实例添加所有剩余容量。
+ 如果同时设置了 `MaximumCoreCapacityUnits` 和 `MaximumOnDemandCapacityUnits` 参数，Amazon EMR 在扩展期间会考虑这两个限制。

  例如，如果 `MaximumCoreCapacityUnits` 小于 `MaximumOnDemandCapacityUnits`，Amazon EMR 首先扩展核心节点，直到达到核心容量限制。对于剩余容量，Amazon EMR 首先使用按需型实例扩展任务节点，直到达到按需型限制，然后对任务节点使用竞价型实例。

**缩减策略**
+ 与纵向扩展策略类似，Amazon EMR 会根据节点标签删除节点。有关节点标签的更多信息，请参阅[了解节点类型：主节点、核心节点和任务节点](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)。
+ 如果您尚未启用节点标签，托管扩展将删除任务节点，然后删除核心节点，直到达到所需的缩减目标容量。托管扩展绝不会将集群缩减到托管扩展策略中指定的最小限制以下。
+ Amazon EMR 版本 5.34.0 及更高版本以及 Amazon EMR 版本 6.4.0 及更高版本支持 Spark 随机排序数据感知，这可以防止实例在托管扩展感知到现有随机排序数据时缩减。有关随机排序操作的更多信息，请参阅 [Spark 编程指南](https://spark.apache.org/docs/latest/rdd-programming-guide.html#shuffle-operations)。托管扩展会尽最大努力防止使用任何活跃 Spark 应用程序当前和上一阶段的随机排序数据缩减节点，最长不超过 30 分钟。这有助于最大限度地减少随机排序数据意外丢失，从而避免重新尝试作业和重新计算中间数据。但是，并不能保证防止随机排序数据丢失。为了改进 Spark 随机播放保护，我们建议对版本标签为 7.4 或更高版本的集群进行洗牌感知。在集群配置中添加以下标志，以启用改进的 Spark shuffle 保护。
  + 如果`yarn.nodemanager.shuffledata-monitor.interval-ms`标志（默认 30000 毫秒）或`spark.dynamicAllocation.executorIdleTimeout`（默认 60 秒）已更改为默认值，请`true`通过更新必要的标志来确保条件`spark.dynamicAllocation.executorIdleTimeout > yarn.nodemanager.shuffledata-monitor.interval-ms`保持不变。

    ```
    [
    	{
    		"Classification": "yarn-site",
    		"Properties": { 
    		"yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data": "true"
    		}
    	},
    	{
    		"Classification": "spark-defaults",
    		"Properties": {
    		"spark.dynamicAllocation.enabled": "true",
    		"spark.shuffle.service.removeShuffle": "true"
    		}
    	}
    ]
    ```
+ 托管扩展首先删除任务节点，然后删除核心节点，直到达到所需的缩减目标容量。集群的扩展绝不会低于托管扩展策略中指定的最小限制。
+ 对于使用 Amazon EMR 5.x 版本 5.34.0 及更高版本以及 6.x 版本 6.4.0 及更高版本启动的集群，如果在 Apache Spark 上运行的应用程序中有活动阶段，Amazon EMR 托管扩展不会缩小`ApplicationMaster`适用于 Apache Spark 的节点。这样可以最大限度地减少任务失败和重试次数，这有助于提高作业性能并降低成本。要确认集群中哪些节点正在运行 `ApplicationMaster`，请访问 Spark 历史记录服务器，然后在 Spark 应用程序 ID 的**执行程序**选项卡下筛选驱动程序。
+ 虽然使用 EMR 托管扩展进行智能扩展可最大限度地减少 Spark 的随机排序数据丢失，但是在某些情况下，在缩减期间可能无法保护瞬态随机排序数据。为了增强缩减期间随机排序数据的弹性，建议在 YARN 中启用**随机排序数据正常停用**。在 YARN 中启用**随机排序数据正常停用**后，选择进行缩减且具有随机排序数据的节点将进入**停用**状态并继续提供随机排序文件。YARN 会 ResourceManager 等到节点报告不存在随机文件，然后再从集群中移除节点。
  + Amazon EMR 6.11.0 及更高版本支持 Tez 和 Shuffle Handlers 的 **Hive** 洗牌数据基于 Yarn 的优雅停用。 MapReduce 
    + 通过将 `yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data` 设置为 `true` 来启用随机排序数据正常停用。
  + 启用外部随机排序服务后（EMR on EC2 中默认启用），Amazon EMR 7.4.0 及更高版本支持基于 Yarn 的 Spark 随机排序数据正常停用。
    + 在 Yarn 上运行 Spark 时，Spark 外部随机播放服务的默认行为是 Yarn NodeManager 在应用程序终止时删除应用程序的洗牌文件。这可能会影响节点停用速度和计算利用率。对于长时间运行的应用程序，请考虑将 `spark.shuffle.service.removeShuffle` 设置为 `true` 以移除不再使用的随机排序文件，从而更快地停用没有活跃随机排序数据的节点。
  + 为了最大限度地减少 Amazon EMR 7.4.0 及更高版本中的 Spark shuffle 数据丢失，请考虑设置以下标志。
    + 如果`yarn.nodemanager.shuffledata-monitor.interval-ms`标志（默认 30000 毫秒）或`spark.dynamicAllocation.executorIdleTimeout`（默认 60 秒）已更改为默认值，请`true`通过更新必要的标志来确保条件`spark.dynamicAllocation.executorIdleTimeout > yarn.nodemanager.shuffledata-monitor.interval-ms`保持不变。

      ```
      [
      	{
      		"Classification": "yarn-site",
      		"Properties": { 
      		"yarn.resourcemanager.decommissioning-nodes-watcher.wait-for-shuffle-data": "true"
      		}
      	},
      	{
      		"Classification": "spark-defaults",
      		"Properties": {
      		"spark.dynamicAllocation.enabled": "true",
      		"spark.shuffle.service.removeShuffle": "true"
      		}
      	}
      ]
      ```

如果集群没有任何负载，Amazon EMR 将取消在之前评估中添加的新实例，并执行缩减操作 如果集群负载过重，Amazon EMR 会取消移除实例，并执行纵向扩展操作。

## 节点分配注意事项


我们建议您对核心节点使用按需型购买选项，以避免在竞价型实例回收时丢失 HDFS 数据。当更多竞价型实例添加到任务节点时，您可以使用任务节点的竞价型购买选项来降低成本并加快任务执行速度。

## 节点分配方案


您可以通过设置不同组合的最大、最小、按需限制和最大核心节点参数，根据您的需求创建各种扩展方案。

**方案 1: 仅扩展核心节点**

要仅扩展核心节点，托管式扩展参数必须满足以下要求：
+ 按需限制等于最大边界。
+ 最大核心节点等于最大边界。

当未指定按需限制和最大核心节点参数时，这两个参数都默认为最大边界。

如果您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `CORE` 节点上运行，那么这种情况就不适用，因为托管扩展会扩展任务节点以满足执行程序的需求。

以下示例仅演示了扩展核心节点的方案。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**方案 2：仅扩展任务节点 **

要仅扩展任务节点，托管扩展参数必须满足以下要求：
+ 最大核心节点必须等于最小边界。

以下示例仅演示了扩展任务节点的方案。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**方案 3：集群中仅有按需型实例 **

要仅拥有按需型实例，您的集群和托管扩展参数必须满足以下要求：
+ 按需限制等于最大边界。

  当未指定按需限制时，参数值默认为最大边界。默认值表示 Amazon EMR 仅扩展按需型实例。

如果最大核心节点小于最大边界，则可以使用最大核心节点参数来分配核心节点和任务节点之间的容量。

要在由实例组组成的集群中启用此方案，集群中的所有节点组必须在初始配置期间使用按需市场类型。

如果您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `ON_DEMAND` 节点上运行，那么这种情况就不适用，因为托管扩展会扩展 `Spot` 节点以满足执行程序的需求。

以下示例演示了在整个集群中使用按需型实例的方案。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**方案 4: 集群中只有竞价型实例**

要仅拥有竞价型实例，托管扩展参数必须满足以下要求：
+ 按需限制设置为 0。

如果最大核心节点小于最大边界，则可以使用最大核心节点参数来分配核心节点和任务节点之间的容量。

要在由实例组组成的集群中启用此方案，核心实例组必须在初始配置期间使用竞价型购买选项。如果任务实例组中没有竞价型实例，则 Amazon EMR 托管扩展会在需要时使用竞价型实例创建任务组。

如果您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `ON_DEMAND` 节点上运行，那么这种情况就不适用，因为托管扩展会扩展 `ON_DEMAND` 节点以满足应用程序进程的需求。

以下示例演示了在整个集群中使用竞价型实例的方案。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**方案 5：在核心节点上扩展按需型实例，在任务节点上扩展 Spot 实例 **

要在核心节点上扩展按需型实例和在任务节点上扩展 Spot 实例，托管扩展参数必须满足以下要求：
+ 按需限制必须等于最大核心节点。
+ 按需限制和最大核心节点必须小于最大边界。

要在由实例组组成的集群中启用此方案，核心节点组必须使用按需购买选项。

如果您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `ON_DEMAND` 节点或 `CORE` 节点上运行，那么这种情况就不适用。

以下示例演示了在核心节点上扩展按需型实例和在任务节点上扩展竞价型实例的方案。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**场景 6：根据应用程序进程需求扩展 `CORE` 实例，根据执行程序需求扩展 `TASK` 实例。**

只有当您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `CORE` 节点上运行，这种情况才适用。

要根据应用程序进程需求扩展 `CORE` 节点，根据执行程序需求扩展 `TASK` 节点，必须在集群启动时设置以下配置：
+  `yarn.node-labels.enabled:true` 
+  `yarn.node-labels.am.default-node-label-expression: 'CORE'` 

当未指定 `ON_DEMAND` 限制和最大 `CORE` 节点参数时，这两个参数都默认为最大边界。

如果最大 `ON_DEMAND` 节点小于最大边界，托管扩展将使用最大 `ON_DEMAND` 节点参数在 `ON_DEMAND` 和 `SPOT` 节点之间拆分容量分配。如果将最大 `CORE` 节点参数设置为小于或等于最小容量参数，则 `CORE` 节点在最大核心容量下保持静态。

以下示例演示了根据应用进程需求扩展 CORE 实例和根据执行程序需求扩展 TASK 实例的场景。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

**场景 7：根据应用程序进程需求扩展 `ON_DEMAND` 实例，根据执行程序需求扩展 `SPOT` 实例。**

只有当您在节点标签中使用托管扩展，并将应用程序进程限制为仅在 `ON_DEMAND` 节点上运行，这种情况才适用。

要根据应用程序进程需求扩展 `ON_DEMAND` 节点，根据执行程序需求扩展 `SPOT` 节点，必须在集群启动时设置以下配置：
+  `yarn.node-labels.enabled:true` 
+  `yarn.node-labels.am.default-node-label-expression: 'ON_DEMAND'` 

当未指定 `ON_DEMAND` 限制和最大 `CORE` 节点参数时，这两个参数都默认为最大边界。

如果最大 `CORE` 节点小于最大边界，托管扩展将使用最大 `CORE` 节点参数在 `CORE` 和 `TASK` 节点之间拆分容量分配。如果将最大 `CORE` 节点参数设置为小于或等于最小容量参数，则 `CORE` 节点在最大核心容量下保持静态。

以下示例演示了根据应用进程需求扩展按需型实例和根据执行程序需求扩展竞价型实例的场景。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

# 了解 Amazon EMR 中的托管扩展指标
托管扩展指标

为集群启用托管扩展时，Amazon EMR 以一分钟的精细程度发布高分辨率数据指标。您可以通过 Amazon EMR 控制台或 Amazon 控制台查看由托管扩展控制的每次调整大小启动和完成的事件。 CloudWatch CloudWatch 指标对于 Amazon EMR 托管扩展的运行至关重要。我们建议您密切监控 CloudWatch 指标，确保数据不会丢失。有关如何配置 CloudWatch 警报以检测缺失指标的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.amazonaws.cn//AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。有关在 Amazon EMR 中使用 CloudWatch 事件的更多信息，请参阅[监控 CloudWatch](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html)事件。

以下指标指示集群的当前容量或目标容量。仅当启用了托管扩展时，这些指标才可用。对于由实例集组成的集群，将在 `Units` 中测量集群容量指标。对于由实例组组成的集群，将根据托管扩展策略中使用的单位类型在 `Nodes` 或 `vCPU` 中测量集群容量指标。


| 指标 | 说明 | 
| --- | --- | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  集群units/nodes/vCPUs中的目标总数，由托管扩展确定。 单位：*计数*  | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  正在运行的集群中当前units/nodes/vCPUs可用的总数。当请求集群大小调整时，将在集群中添加或删除新实例后更新此指标。 单位：*计数*  | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  集群units/nodes/vCPUs中的目标 CORE 数量，由托管扩展确定。 单位：*计数*  | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  集群中当前units/nodes/vCPUs运行的 CORE 数量。 单位：*计数*  | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  集群units/nodes/vCPUs中任务的目标数量，由托管扩展决定。 单位：*计数*  | 
|  [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/managed-scaling-metrics.html)  |  集群中当前units/nodes/vCPUs运行的 TASK 数量。 单位：*计数*  | 

以下指标指示集群和应用程序的使用状态。这些指标可用于所有 Amazon EMR 功能，但在为集群启用托管扩展时，将以更高的分辨率和一分钟的精细程度发布数据。您可以将以下指标与上表中的集群容量指标相关联，以了解托管扩展决策。


| 指标 | 说明 | 
| --- | --- | 
|  `AppsCompleted`  |  提交给 YARN 并且已完成的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
|  `AppsPending`  |  提交给 YARN 并且处于挂起状态的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
|  `AppsRunning`  |  提交给 YARN 并且正在运行的应用程序数。 使用案例：监控集群进度 单位：*计数*  | 
| ContainerAllocated |  分配的资源容器数量ResourceManager。 使用案例：监控集群进度 单位：*计数*  | 
|  `ContainerPending`  |  队列中尚未分配的容器数。 使用案例：监控集群进度 单位：*计数*  | 
| ContainerPendingRatio |  待处理容器与已分配容器的比率 (ContainerPendingRatio = ContainerPending / ContainerAllocated)。如果 ContainerAllocated = 0，则为 ContainerPendingRatio = ContainerPending。的值 ContainerPendingRatio 代表数字，而不是百分比。此值对基于容器分配行为扩展集群资源很有用。 单位：*计数*  | 
|  `HDFSUtilization`  |  当前使用的 HDFS 存储的百分率。 使用案例：分析集群性能 单位：*百分比*  | 
|  `IsIdle`  |  指示集群不再执行任务，但仍处于活动状态并会产生费用。如果没有任何任务和任务处于运行状态，则此指标设置为 1；否则设置为 0。系统每隔五分钟检查一次该值，值为 1 仅表示在检查时集群处于空闲状态，并不表示它整个五分钟内都处于空闲状态。为避免误报，当多次连续五分钟检查获得的值均为 1 时，您应提出警报。例如，当该值在三十分钟或更长时间内都为 1 时，您应提出警报。 使用案例：监控集群性能 单位：*布尔值*  | 
|  `MemoryAvailableMB`  |  可供分配的内存量。 使用案例：监控集群进度 单位：*计数*  | 
|  `MRActiveNodes`  |  当前正在运行 MapReduce 任务或作业的节点数量。等效于 YARN 指标 `mapred.resourcemanager.NoOfActiveNodes`。 使用案例：监控集群进度 单位：*计数*  | 
|  `YARNMemoryAvailablePercentage`  |  YARN 可用的剩余内存百分比 (YARNMemoryAvailablePercentage = MemoryAvailable MB/ MemoryTotal MB)。此值对基于 YARN 内存使用量扩展集群资源很有用。 单位：*百分比*  | 

以下指标提供有关 YARN 容器和节点所用资源的信息。YARN 资源管理器的这些指标有助于深入了解集群中运行的容器和节点所使用的资源。请将这些指标与上表中的集群容量指标进行比较，以便更清晰地了解托管扩展的影响：


| 指标 | 相关版本 | 说明 | 
| --- | --- | --- | 
|  `YarnContainersUsedMemoryGBSeconds`  |  适用于发行版标签 7.3.0 及更高版本  |  发布期间消耗的容器内存 \$1 秒数。 **单位：**GB \$1 秒  | 
|  `YarnContainersTotalMemoryGBSeconds`  |  适用于发行版标签 7.3.0 及更高版本  |  发布期间的 yarn 容器总数 \$1 秒数。 **单位：**GB \$1 秒  | 
|  `YarnContainersUsedVCPUSeconds`  |  适用于发行版标签 7.5.0 及更高版本  |  发布期间消耗的容器 VCPU \$1 秒数。 **单位：**VCPU \$1 秒  | 
| `YarnContainersTotalVCPUSeconds` | 适用于发行版标签 7.5.0 及更高版本 |  发布期间的容器 VCPU 总数 \$1 秒数。 **单位：**VCPU \$1 秒  | 
|  `YarnNodesUsedMemoryGBSeconds`  |  适用于发行版标签 7.5.0 及更高版本  |  发布期间消耗的节点内存 \$1 秒数。 **单位：**GB \$1 秒  | 
| `YarnNodesTotalMemoryGBSeconds` | 适用于发行版标签 7.5.0 及更高版本 |  发布期间的总节点内存 \$1 秒数。 **单位：**GB \$1 秒  | 
|  `YarnNodesUsedVCPUSeconds`  |  适用于发行版标签 7.3.0 及更高版本  |  发布期间消耗的节点 VCPU \$1 秒数。 **单位：**VCPU \$1 秒  | 
|  `YarnNodesTotalVCPUSeconds`  |  适用于发行版标签 7.3.0 及更高版本  |  发布期间的总节点 VCPU \$1 秒数。 **单位：**VCPU \$1 秒  | 

## 绘制托管扩展指标的图表


您可以绘制指标图表，以便直观地显示集群的工作负载模式和 Amazon EMR 托管扩展做出的相应扩展决策，如以下步骤所示。

**在 CloudWatch 控制台中绘制托管扩展指标的图表**

1. 打开 [CloudWatch 控制台](https://console.amazonaws.cn/cloudwatch/)。

1. 在导航窗格中，选择 **Amazon EMR**。您可以搜索要监控的集群的集群标识符。

1. 向下滚动到图形的指标。打开指标显示图形。

1. 要为一个或多个指标绘制图表，请选中每个指标旁边的复选框。

以下示例介绍了集群的 Amazon EMR 托管扩展活动。该图形显示三个自动缩减期，这些时段可在工作负载活动性较低时节省成本。

![\[绘制托管扩展指标的图形\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/Managed_Scaling_Decision.png)


所有集群容量和使用指标均以一分钟的间隔发布。其它统计信息也与每个一分钟数据相关联，这样您就可以绘制各种函数，如 `Percentiles`、`Min`、`Max`、`Sum` 、`Average`、`SampleCount`。

例如，下图以不同的百分位数 P10、P50、P90、P99 绘制同一 `YARNMemoryAvailablePercentage` 指标以及 `Sum`、`Average`、`Min`、`SampleCount`。

![\[使用不同百分位数绘制托管扩展指标的图形\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/Managed_Scaling_Metrics.png)


# 将自动扩展与 Amazon EMR 中实例组的自定义策略结合使用
使用自定义策略自动扩缩

*通过在 Amazon EMR 4.0 及更高版本中使用自定义策略自动扩展，您可以根据您在扩展策略中指定的 CloudWatch 指标和其他参数，以编程方式扩展和扩展核心节点和任务节点。*实例组配置可使用具有自定义策略的自动扩展，在您使用实例队列时，自动扩展不可用。有关实例组和实例队列的更多信息，请参阅[使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)。

**注意**  
要在 Amazon EMR 中使用具有自定义策略功能的自动伸缩，您必须在创建集群时为 `VisibleToAllUsers` 参数设置 `true`。有关更多信息，请参阅 [SetVisibleToAllUsers](https://docs.amazonaws.cn/emr/latest/APIReference/API_SetVisibleToAllUsers.html)。

扩展策略是实例组配置的一部分。您可以在初始配置实例组的过程中指定策略，或者通过修改现有集群中的实例组 (甚至在实例组处于活动状态时) 来指定策略。集群中的每个实例组（主实例组除外）均可拥有自己的扩展策略，该策略包含横向扩展和横向缩减规则。可单独配置横向扩展规则和缩减规则，每种规则具有不同的参数。

您可以使用 Amazon Web Services 管理控制台 Amazon CLI、或 Amazon EMR API 配置扩展策略。当您使用 Amazon CLI 或 Amazon EMR API 时，您需要以 JSON 格式指定扩展策略。此外，使用 Amazon CLI 或 Amazon EMR API 时，您可以指定自定义 CloudWatch 指标。自定义指标不可用于使用 Amazon Web Services 管理控制台的选项。当您最初使用控制台创建扩展策略时，将预配置适用于许多应用程序的默认策略以帮助您入门。您可以删除或修改默认规则。

尽管自动扩展允许您调整 EMR 集群容量 on-the-fly，但您仍应考虑基准工作负载要求并规划节点和实例组配置。有关更多信息，请参阅[集群配置指南](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-instances-guidelines.html)。

**注意**  
对于大多数工作负载，需要同时设置横向扩展规则和缩减规则才能优化资源使用率。单独设置其中一种规则意味着，您需要在扩展活动后手动调整实例计数的大小。换句话说，这将通过手动重置来设置“单向”自动横向扩展规则或缩减规则。

## 为自动伸缩功能创建 IAM 角色


Amazon EMR 中的自动伸缩功能需要一个 IAM 角色，此角色有权在触发扩展活动时添加和终止实例。使用适当的角色策略和信任策略配置的默认角色 `EMR_AutoScaling_DefaultRole` 可用于实现此目的。当您首次使用使用扩展策略创建集群时 Amazon Web Services 管理控制台，Amazon EMR 会创建默认角色并附加默认的权限托管策略。`AmazonElasticMapReduceforAutoScalingRole`

当您使用使用自动扩展策略创建集群时 Amazon CLI，必须首先确保默认 IAM 角色存在，或者您拥有一个自定义 IAM 角色，该角色附加了提供相应权限的策略。要创建默认角色，您可以在创建集群前运行 `create-default-roles` 命令。然后，您可以在创建集群时指定 `--auto-scaling-role EMR_AutoScaling_DefaultRole` 选项。或者，您也可以创建一个自定义自动扩展角色，然后在创建集群时指定该角色，例如 `--auto-scaling-role MyEMRAutoScalingRole`。如果您创建了一个适用于 Amazon EMR 的自定义自动伸缩角色，建议您根据托管式策略制定自定义角色的权限策略。有关更多信息，请参阅[配置 IAM 服务角色以获得 Amazon EMR 对 Amazon 服务和资源的权限](emr-iam-roles.md)。

## 了解自动伸缩角色


当横向扩展规则触发实例组的扩展活动时，将根据您的规则向实例组添加 Amazon EC2 实例。只要 Amazon EC2 实例进入 `InService` 状态，应用程序（如 Apache Spark、Apache Hive 和 Presto）就可使用新节点。您也可以设置用于终止实例和移除节点的横向缩减规则。有关自动扩展 Amazon EC2 实例生命周期的更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的 [Auto Scaling 生命周期](https://docs.amazonaws.cn/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html)。

您可以配置集群终止 Amazon EC2 实例的方式，可以选择在用于计费的 Amazon EC2 实例小时边界终止或在任务完成时终止。此设置同时应用于自动扩展和手动调整大小操作。有关此配置的更多信息，请参阅[Amazon EMR 集群的集群缩减选项](emr-scaledown-behavior.md)。

策略中每个规则的以下参数可确定自动扩展行为。

**注意**  
此处列出的参数基于 Amazon Web Services 管理控制台 适用于 Amazon EMR 的。当您使用 Amazon CLI 或 Amazon EMR API 时，还有其他高级配置选项可用。有关高级选项的更多信息，请参阅 *Amazon EMR API* 参考[SimpleScalingPolicyConfiguration](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_PutAutoScalingPolicy.html)中的。
+ 最大实例数和最小实例数。**Maximum instances (最大实例数)** 约束指定了实例组可包含的 Amazon EC2 实例的最大数目，并且此约束应用于所有横向扩展规则。同样，**Minimum instances (最小实例数)** 约束指定了最小 Amazon EC2 实例数，并且此约束应用于所有横向缩减规则。
+ **Rule name (规则名称)**，此参数在策略中必须是唯一的。
+ **scaling adjustment (扩展调整)**，此参数确定在规则触发的扩展活动期间要添加的 EC2 实例的数目（适用于横向扩展规则）或要终止的 EC2 实例的数目（适用于缩减规则）。
+ **CloudWatch 指标**，监视是否存在警报情况。
+ **比较运算符**，用于将CloudWatch 指标与**阈**值进行比较并确定触发条件。
+ **评估期**，以五分钟为增量，在此期间， CloudWatch 指标必须处于触发状态，然后才会触发扩展活动。
+ **Cooldown period (冷却时间)**（以秒为单位），用于确定由规则启动的一个扩展活动和下一个扩展活动开始之间必须经过的时间量，而不管触发扩展活动的规则如何。当实例组完成扩展活动并达到扩展后状态时，冷却时间为可能触发后续扩展活动的 CloudWatch 指标提供了稳定下来的机会。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的 [Auto Scaling 冷却时间](https://docs.amazonaws.cn/autoscaling/ec2/userguide/Cooldown.html)。  
![\[Amazon Web Services 管理控制台 Amazon EMR 的自动扩展规则参数。\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/auto-scaling-rule-params.png)

## 注意事项和限制

+ 亚马逊 CloudWatch 指标对于 Amazon EMR 自动扩展的运行至关重要。我们建议您密切监控 Amazon CloudWatch 指标，确保数据不会丢失。有关如何配置 Amazon CloudWatch 警报以检测缺失指标的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。
+ 过度使用 EBS 卷可能会导致托管扩展问题。我们建议您密切监控 EBS 卷的使用情况，以确保 EBS 卷的利用率低于 90％。请参阅 [实例存储](https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-storage.html) 以了解有关指定额外 EBS 卷的信息。
+ 在 Amazon EMR 版本 5.18 至 5.28 中使用自定义策略进行自动扩展可能会遇到由于亚马逊指标中间歇性缺少数据而导致扩展失败。 CloudWatch我们建议您使用最新版本的 Amazon EMR 来改进自动扩展。如果您希望使用 5.18 到 5.28 之间的 Amazon EMR 发行版，也可以联系 [Amazon Support](https://www.amazonaws.cn/premiumsupport/) 获取补丁。

## 使用配置 Amazon Web Services 管理控制台 自动缩放


创建集群时，可以使用高级集群配置选项为实例组配置扩展策略。此外，您也可以通过在现有集群的 **Hardware (硬件)** 设置中修改实例组，为使用中的实例组创建或修改扩展策略。

1. 导航到 Amazon EMR 新控制台，然后从侧面导航栏中选择**切换到旧控制台**。有关切换到旧控制台后预期情况的更多信息，请参阅 [Using the old console](https://docs.amazonaws.cn/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

1. 如果您正在创建集群，请在 Amazon EMR 控制台中，依次选择 **Create Cluster (创建集群)**、**Go to advanced options (转到高级选项)**、**Step 1: Software and Steps (步骤 1: 软件和步骤)**，然后转至 **Step 2: Hardware Configuration (步骤 2: 硬件配置)**。

   **：或 - **

   如果您修改的是正在运行的集群中的实例组，请从集群列表中选择您的集群，然后展开 **Hardware (硬件)** 部分。

1. 在 **Cluster scaling and provisioning option**（集群扩展和预置选项）部分中，选择 **Enable cluster scaling**（启用集群扩展）。然后，选择 **Create a custom automatic scaling policy (创建自定义自动扩展策略)**。

   在 **Custom automatic scaling policies (自定义自动扩展策略)** 表中，单击要配置实例组所在行中显示的铅笔图标。Auto Scaling 规则屏幕将打开。

1. 键入**最大实例数**，这是您希望实例组在横向扩展后包含的最大实例数；并键入**最小实例数**，这是您希望实例组在缩减后包含的最小实例数。

1. 单击铅笔图标以编辑规则参数，单击 **X** 以从策略中删除规则，然后单击**添加规则**以添加其它规则。

1. 选择本主题前面介绍的规则参数。*有关亚马逊 EMR 可用 CloudWatch 指标的描述，请参阅亚马逊用户指南[中的亚马逊 EMR 指标和维度](https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/emr-metricscollected.html)。 CloudWatch *

## 使用配置 Amazon CLI 自动缩放


在创建集群和创建实例组时，您可以使用 Amazon EMR Amazon CLI 命令配置自动扩展。您可以使用速记语法 (可在相关命令中指定内联 JSON 配置)。也可以引用包含配置 JSON 的文件。您也可以将一个自动扩展策略应用于现有实例组并删除以前应用的自动扩展策略。此外，您可以从正在运行的集群中检索扩展策略配置的详细信息。

**重要**  
在创建具有自动伸缩策略的集群时，您必须使用 `--auto-scaling-role MyAutoScalingRole` 命令来指定用于自动伸缩的 IAM 角色。默认角色为 `EMR_AutoScaling_DefaultRole`，可使用 `create-default-roles` 命令创建它。此角色只能在创建集群时添加且无法添加到现有集群。

有关配置自动扩展策略时可用参数的详细说明，请参阅 [PutAutoScalingPolicy](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_PutAutoScalingPolicy.html)*Amazon EMR API* 参考。

### 创建具有已应用于实例组的自动伸缩策略的集群


您可在 `aws emr create-cluster` 命令的 `--instance-groups` 选项内指定自动扩展配置。以下示例说明了一个 create-cluster 命令，其中以内联方式提供核心实例组的自动扩展策略。该命令创建的扩展配置等同于默认的横向扩展策略，当您使用 for Amazon Web Services 管理控制台 Amazon EMR 创建自动扩展策略时，该策略会出现。为简洁起见，不显示缩减策略。建议不要创建没有向内扩展规则的向外扩展规则。

```
aws emr create-cluster --release-label emr-5.2.0 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --auto-scaling-role EMR_AutoScaling_DefaultRole  --instance-groups Name=MyMasterIG,InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1 'Name=MyCoreIG,InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=2,AutoScalingPolicy={Constraints={MinCapacity=2,MaxCapacity=10},Rules=[{Name=Default-scale-out,Description=Replicates the default scale-out rule in the console.,Action={SimpleScalingPolicyConfiguration={AdjustmentType=CHANGE_IN_CAPACITY,ScalingAdjustment=1,CoolDown=300}},Trigger={CloudWatchAlarmDefinition={ComparisonOperator=LESS_THAN,EvaluationPeriods=1,MetricName=YARNMemoryAvailablePercentage,Namespace=AWS/ElasticMapReduce,Period=300,Statistic=AVERAGE,Threshold=15,Unit=PERCENT,Dimensions=[{Key=JobFlowId,Value="${emr.clusterId}"}]}}}]}'				
```

 以下命令说明了如何使用命令行将自动扩展策略定义作为实例组配置文件（名为 `instancegroupconfig.json`）的一部分提供。

```
aws emr create-cluster --release-label emr-5.2.0 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --instance-groups file://your/path/to/instancegroupconfig.json --auto-scaling-role EMR_AutoScaling_DefaultRole								
```

具有配置文件的内容，如下所示：

```
[
{
  "InstanceCount": 1,
  "Name": "MyMasterIG",
  "InstanceGroupType": "MASTER",
  "InstanceType": "m5.xlarge"
},
{
  "InstanceCount": 2,
  "Name": "MyCoreIG",
  "InstanceGroupType": "CORE",
  "InstanceType": "m5.xlarge",
  "AutoScalingPolicy":
    {
     "Constraints":
      {
       "MinCapacity": 2,
       "MaxCapacity": 10
      },
     "Rules":
     [
      {
       "Name": "Default-scale-out",
       "Description": "Replicates the default scale-out rule in the console for YARN memory.",
       "Action":{
        "SimpleScalingPolicyConfiguration":{
          "AdjustmentType": "CHANGE_IN_CAPACITY",
          "ScalingAdjustment": 1,
          "CoolDown": 300
        }
       },
       "Trigger":{
        "CloudWatchAlarmDefinition":{
          "ComparisonOperator": "LESS_THAN",
          "EvaluationPeriods": 1,
          "MetricName": "YARNMemoryAvailablePercentage",
          "Namespace": "AWS/ElasticMapReduce",
          "Period": 300,
          "Threshold": 15,
          "Statistic": "AVERAGE",
          "Unit": "PERCENT",
          "Dimensions":[
             {
               "Key" : "JobFlowId",
               "Value" : "${emr.clusterId}"
             }
          ]
        }
       }
      }
     ]
   }
}
]
```

### 将具有自动伸缩策略的实例组添加到集群


您可以将 `--instance-groups` 选项与 `add-instance-groups` 命令结合使用来指定扩展策略配置，所采用的方式与使用 `create-cluster` 时的方式相同。以下示例将 JSON 文件 `instancegroupconfig.json` 引用与实例组配置结合使用。

```
aws emr add-instance-groups --cluster-id j-1EKZ3TYEVF1S2 --instance-groups file://your/path/to/instancegroupconfig.json
```

### 向现有实例组应用自动伸缩策略或修改已应用的策略


使用 `aws emr put-auto-scaling-policy` 命令将自动扩展策略应用于现有实例组。该实例组必须是使用自动伸缩 IAM 角色的集群的一部分。以下示例使用对指定自动扩展策略配置的 JSON 文件 `autoscaleconfig.json` 的引用。

```
aws emr put-auto-scaling-policy --cluster-id j-1EKZ3TYEVF1S2 --instance-group-id ig-3PLUZBA6WLS07 --auto-scaling-policy file://your/path/to/autoscaleconfig.json 
```

下面显示了 `autoscaleconfig.json` 文件的内容，此文件定义上一示例中显示的相同的横向扩展规则。

```
{
          "Constraints": {
                  "MaxCapacity": 10,
                  "MinCapacity": 2
          },
          "Rules": [{
                  "Action": {
                          "SimpleScalingPolicyConfiguration": {
                                  "AdjustmentType": "CHANGE_IN_CAPACITY",
                                  "CoolDown": 300,
                                  "ScalingAdjustment": 1
                          }
                  },
                  "Description": "Replicates the default scale-out rule in the console for YARN memory",
                  "Name": "Default-scale-out",
                  "Trigger": {
                          "CloudWatchAlarmDefinition": {
                                  "ComparisonOperator": "LESS_THAN",
                                  "Dimensions": [{
                                          "Key": "JobFlowId",
                                          "Value": "${emr.clusterID}"
                                  }],
                                  "EvaluationPeriods": 1,
                                  "MetricName": "YARNMemoryAvailablePercentage",
                                  "Namespace": "AWS/ElasticMapReduce",
                                  "Period": 300,
                                  "Statistic": "AVERAGE",
                                  "Threshold": 15,
                                  "Unit": "PERCENT"
                          }
                  }
          }]
  }
```

### 从实例组中删除自动伸缩策略


```
aws emr remove-auto-scaling-policy --cluster-id j-1EKZ3TYEVF1S2 --instance-group-id ig-3PLUZBA6WLS07
```

### 检索自动伸缩策略配置


该`describe-cluster`命令检索 InstanceGroup 区块中的策略配置。例如，以下命令检索集群 ID 为 `j-1CWOHP4PI30VJ` 的集群的配置。

```
aws emr describe-cluster --cluster-id j-1CWOHP4PI30VJ
```

该命令生成以下示例输出。

```
{
    "Cluster": {
        "Configurations": [],
        "Id": "j-1CWOHP4PI30VJ",
        "NormalizedInstanceHours": 48,
        "Name": "Auto Scaling Cluster",
        "ReleaseLabel": "emr-5.2.0",
        "ServiceRole": "EMR_DefaultRole",
        "AutoTerminate": false,
        "TerminationProtected": true,
        "MasterPublicDnsName": "ec2-54-167-31-38.compute-1.amazonaws.com",
        "LogUri": "s3n://aws-logs-232939870606-us-east-1/elasticmapreduce/",
        "Ec2InstanceAttributes": {
            "Ec2KeyName": "performance",
            "AdditionalMasterSecurityGroups": [],
            "AdditionalSlaveSecurityGroups": [],
            "EmrManagedSlaveSecurityGroup": "sg-09fc9362",
            "Ec2AvailabilityZone": "us-east-1d",
            "EmrManagedMasterSecurityGroup": "sg-0bfc9360",
            "IamInstanceProfile": "EMR_EC2_DefaultRole"
        },
        "Applications": [
            {
                "Name": "Hadoop",
                "Version": "2.7.3"
            }
        ],
        "InstanceGroups": [
            {
                "AutoScalingPolicy": {
                    "Status": {
                        "State": "ATTACHED",
                        "StateChangeReason": {
                            "Message": ""
                        }
                    },
                    "Constraints": {
                        "MaxCapacity": 10,
                        "MinCapacity": 2
                    },
                    "Rules": [
                        {
                            "Name": "Default-scale-out",
                            "Trigger": {
                                "CloudWatchAlarmDefinition": {
                                    "MetricName": "YARNMemoryAvailablePercentage",
                                    "Unit": "PERCENT",
                                    "Namespace": "AWS/ElasticMapReduce",
                                    "Threshold": 15,
                                    "Dimensions": [
                                        {
                                            "Key": "JobFlowId",
                                            "Value": "j-1CWOHP4PI30VJ"
                                        }
                                    ],
                                    "EvaluationPeriods": 1,
                                    "Period": 300,
                                    "ComparisonOperator": "LESS_THAN",
                                    "Statistic": "AVERAGE"
                                }
                            },
                            "Description": "",
                            "Action": {
                                "SimpleScalingPolicyConfiguration": {
                                    "CoolDown": 300,
                                    "AdjustmentType": "CHANGE_IN_CAPACITY",
                                    "ScalingAdjustment": 1
                                }
                            }
                        },
                        {
                            "Name": "Default-scale-in",
                            "Trigger": {
                                "CloudWatchAlarmDefinition": {
                                    "MetricName": "YARNMemoryAvailablePercentage",
                                    "Unit": "PERCENT",
                                    "Namespace": "AWS/ElasticMapReduce",
                                    "Threshold": 75,
                                    "Dimensions": [
                                        {
                                            "Key": "JobFlowId",
                                            "Value": "j-1CWOHP4PI30VJ"
                                        }
                                    ],
                                    "EvaluationPeriods": 1,
                                    "Period": 300,
                                    "ComparisonOperator": "GREATER_THAN",
                                    "Statistic": "AVERAGE"
                                }
                            },
                            "Description": "",
                            "Action": {
                                "SimpleScalingPolicyConfiguration": {
                                    "CoolDown": 300,
                                    "AdjustmentType": "CHANGE_IN_CAPACITY",
                                    "ScalingAdjustment": -1
                                }
                            }
                        }
                    ]
                },
                "Configurations": [],
                "InstanceType": "m5.xlarge",
                "Market": "ON_DEMAND",
                "Name": "Core - 2",
                "ShrinkPolicy": {},
                "Status": {
                    "Timeline": {
                        "CreationDateTime": 1479413437.342,
                        "ReadyDateTime": 1479413864.615
                    },
                    "State": "RUNNING",
                    "StateChangeReason": {
                        "Message": ""
                    }
                },
                "RunningInstanceCount": 2,
                "Id": "ig-3M16XBE8C3PH1",
                "InstanceGroupType": "CORE",
                "RequestedInstanceCount": 2,
                "EbsBlockDevices": []
            },
            {
                "Configurations": [],
                "Id": "ig-OP62I28NSE8M",
                "InstanceGroupType": "MASTER",
                "InstanceType": "m5.xlarge",
                "Market": "ON_DEMAND",
                "Name": "Master - 1",
                "ShrinkPolicy": {},
                "EbsBlockDevices": [],
                "RequestedInstanceCount": 1,
                "Status": {
                    "Timeline": {
                        "CreationDateTime": 1479413437.342,
                        "ReadyDateTime": 1479413752.088
                    },
                    "State": "RUNNING",
                    "StateChangeReason": {
                        "Message": ""
                    }
                },
                "RunningInstanceCount": 1
            }
        ],
        "AutoScalingRole": "EMR_AutoScaling_DefaultRole",
        "Tags": [],
        "BootstrapActions": [],
        "Status": {
            "Timeline": {
                "CreationDateTime": 1479413437.339,
                "ReadyDateTime": 1479413863.666
            },
            "State": "WAITING",
            "StateChangeReason": {
                "Message": "Cluster ready after last step completed."
            }
        }
    }
}
```

# 手动调整正在运行的 Amazon EMR 集群的大小
调整正在运行的集群的大小

您可以使用、或 Amazon EMR API 从核心实例组和任务实例组以及正在运行的集群中的实例队列中添加和删除实例。 Amazon Web Services 管理控制台 Amazon CLI如果集群使用的是实例组，您可显式更改实例计数。如果集群使用的是实例队列，您可更改按需实例和竞价型实例的目标单位数。然后，实例队列可添加和删除实例以满足新目标。有关更多信息，请参阅[实例集选项](emr-instance-fleet.md#emr-instance-fleet-options)。一旦实例可用，应用程序就可使用新预置的 Amazon EC2 实例来托管节点。删除实例后，Amazon EMR 会以不中断任务并防止数据丢失的方式关闭任务。有关更多信息，请参阅 [在任务完成时终止](emr-scaledown-behavior.md#emr-scaledown-terminate-task)。

## 使用控制台调整集群大小


您可以使用 Amazon EMR 控制台调整正在运行的集群的大小。

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

**使用新控制台更改现有集群的实例数**

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

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择要更新的集群。集群必须正在运行；您无法调整预置集群或已终止集群的大小。

1. 在集群详细信息页面的 **Instances**（实例）选项卡上，查看 **Instance groups**（实例组）面板。

1. 要调整现有实例组的大小，请选择要调整大小的核心实例组或任务实例组旁边的单选按钮，然后选择 **Resize instance group**（调整实例组大小）。为实例组指定新的实例数，然后选择 **Resize**（调整大小）。
**注意**  
如果您选择减少正在运行的实例组大小，Amazon EMR 将智能地选择要从实例组中删除的实例，将数据丢失的风险降至最低。要对调整大小操作进行更精细地控制，可以依次选择实例组的 **ID**、要删除的实例，然后使用 **Terminate**（终止）选项。有关智能缩减行为的更多信息，请参阅 [Amazon EMR 集群的集群缩减选项](emr-scaledown-behavior.md)。

1. 如果要取消调整大小操作，您可以选择状态为 **Resizing**（调整大小）的实例组的单选按钮，然后从列表操作中选择 **Stop resize**（停止调整大小）。

1. 要向集群添加一个或多个任务实例组以应对不断增加的工作负载，请从操作列表中选择 **Add task instance group**（添加任务实例组）。选择 Amazon EC2 实例类型，输入任务组的实例数，然后选择 **Add task instance group**（添加任务实例组）以返回到集群的 **Instance groups**（实例组）面板。

------

当您对节点数进行更改时，实例组的 **Status (状态)** 会更新。当您请求的更改完成后，**Status (状态)** 为 **Running (正在运行)**。

## 使用调整集群的大小 Amazon CLI


您可以使用 Amazon CLI 来调整正在运行的集群的大小。您可以增加或减少任务节点数，并且可以增加正在运行的集群中的核心节点数。也可以使用 Amazon CLI 或 API 关闭核心实例组中的实例。应小心地执行此操作。关闭核心实例组中的实例存在数据丢失的风险，且该实例不会被自动替换。

除了调整核心组和任务组的大小之外，还可使用 Amazon CLI向正在运行的集群添加一个或多个任务实例组。<a name="IncreaseDecreaseNodesawscli"></a>

**要通过更改实例计数来调整集群的大小 Amazon CLI**

您可以将实例添加到核心组或任务组，也可以使用带`InstanceCount`参数的 Amazon CLI `modify-instance-groups`子命令从任务组中删除实例。要向核心或任务组添加实例，请增加 `InstanceCount`。要减少任务组中的实例数，请减少 `InstanceCount`。将任务组的实例计数更改为 0 会删除所有实例，而不删除实例组。
+ 要将任务实例组中的实例数从 3 增加到 4，请键入以下命令并*ig-31JXXXXXXBTO*替换为实例组 ID。

  ```
  aws emr modify-instance-groups --instance-groups InstanceGroupId=ig-31JXXXXXXBTO,InstanceCount=4
  ```

  要检索 `InstanceGroupId`，请使用 `describe-cluster` 子命令。输出是一个名为 `Cluster` 的 JSON 对象，其中包含每个实例组的 ID。要使用此命令，您需要集群 ID（可以使用 `aws emr list-clusters` 命令或控制台进行检索）。要检索实例组 ID，请键入以下命令并*j-2AXXXXXXGAPLF*替换为集群 ID。

  ```
  aws emr describe-cluster --cluster-id j-2AXXXXXXGAPLF
  ```

  使用 Amazon CLI，您还可以使用`--modify-instance-groups`子命令终止核心实例组中的实例。
**警告**  
指定 `EC2InstanceIdsToTerminate` 时，请务必谨慎。无论实例上运行的应用程序的状态如何，实例都将立即终止，并且不会自动替换实例。无论集群的 **Scale down behavior (缩减行为)** 配置如何，都会出现此情况。通过这种方式终止实例将面临数据丢失以及出现不可预测的集群行为的风险。

  要终止特定实例，您需要实例组 ID（由`aws emr describe-cluster --cluster-id`子命令返回）和实例 ID（由`aws emr list-instances --cluster-id`子命令返回），键入以下命令，替换*ig-6RXXXXXX07SA*为实例组 ID，然后*i-f9XXXXf2*替换为实例 ID。

  ```
  1. aws emr modify-instance-groups --instance-groups InstanceGroupId=ig-6RXXXXXX07SA,EC2InstanceIdsToTerminate=i-f9XXXXf2
  ```

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

**要通过添加任务实例组来调整集群的大小 Amazon CLI**

使用 Amazon CLI，您可以使用子命令将 1 到 48 个任务实例组添加到集群中。`--add-instance-groups`任务实例组只能添加到包含主实例组和核心实例组的集群。使用时 Amazon CLI，每次使用`--add-instance-groups`子命令时最多可以添加五个任务实例组。

1. 要向集群添加单个任务实例组，请键入以下命令并*j-JXBXXXXXX37R*替换为集群 ID。

   ```
   1. aws emr add-instance-groups --cluster-id j-JXBXXXXXX37R --instance-groups InstanceCount=6,InstanceGroupType=task,InstanceType=m5.xlarge
   ```

1. 要向集群添加多个任务实例组，请键入以下命令并*j-JXBXXXXXX37R*替换为集群 ID。可以在单个命令中添加多达 5 个任务实例组。

   ```
   aws emr add-instance-groups --cluster-id j-JXBXXXXXX37R --instance-groups InstanceCount=6,InstanceGroupType=task,InstanceType=m5.xlarge InstanceCount=10,InstanceGroupType=task,InstanceType=m5.xlarge
   ```

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

## 中断调整


通过使用 Amazon EMR 4.1.0 版或更高版本，您可以在现有大小调整操作执行期间下达新的大小调整指示。此外，您可以停止之前提交的调整请求，或提交新请求以覆盖之前的请求，而不必等待其完成。您还可以从控制台或使用 `ModifyInstanceGroups` API 调用停止现有的大小调整操作，并将当前计数作为目标集群数。

下面的屏幕截图显示了正在调整但可通过选择 **Stop (停止)** 来停止的任务实例组。

![\[Task instance group showing resizing status with options to resize or stop.\]](http://docs.amazonaws.cn/emr/latest/ManagementGuide/images/resize-stop.png)


**使用中断调整大小 Amazon CLI**

您可以使用`modify-instance-groups`子命令 Amazon CLI 停止调整大小。假定您的实例组包含 6 个实例，您需要将实例增加到 10 个。但随后您决定撤消此请求：
+ 初始请求：

  ```
  aws emr modify-instance-groups --instance-groups InstanceGroupId=ig-myInstanceGroupId,InstanceCount=10
  ```

  第二个请求 (停止第一个请求) ：

  ```
  aws emr modify-instance-groups --instance-groups InstanceGroupId=ig-myInstanceGroupId,InstanceCount=6
  ```

**注意**  
此种处理是异步进行的，因此，在执行后续请求前，您可能会看到实例计数相对于之前的 API 请求有所变化。对于缩减请求，如果节点上有正在进行的工作，则在节点完成其工作前，实例组不会缩减。

## “暂停”状态


如果尝试启动新的集群节点时遇到太多错误，实例组就会进入“暂停”状态。例如，如果新节点在执行引导操作时出现故障，实例组会进入 *SUSPENDED (暂停)* 状态，而不是持续地预置新节点。解决了基础问题后，您可以重置集群实例组上所需数量的节点，然后实例组继续开始分配节点。修改实例组会促使 Amazon EMR 尝试再次预置节点。没有重启或终止任何运行节点。

在中 Amazon CLI，`list-instances`子命令和`describe-cluster`子命令一样返回所有实例及其状态。如果 Amazon EMR 检测到实例组故障，则组的状态会更改为 `SUSPENDED`。

**使用重置处于 “已暂停” 状态的集群 Amazon CLI**

键入带有 `describe-cluster` 参数的 `--cluster-id` 子命令可查看集群中实例的状态。
+ 要查看集群中所有实例和实例组的信息，请键入以下命令并*j-3KVXXXXXXY7UG*替换为集群 ID。

  ```
  1. aws emr describe-cluster --cluster-id j-3KVXXXXXXY7UG
  ```

  输出会显示有关实例组和实例状态的信息：

  ```
   1. {
   2.     "Cluster": {
   3.         "Status": {
   4.             "Timeline": {
   5.                 "ReadyDateTime": 1413187781.245,
   6.                 "CreationDateTime": 1413187405.356
   7.             },
   8.             "State": "WAITING",
   9.             "StateChangeReason": {
  10.                 "Message": "Waiting after step completed"
  11.             }
  12.         },
  13.         "Ec2InstanceAttributes": {
  14.             "Ec2AvailabilityZone": "us-west-2b"
  15.         },
  16.         "Name": "Development Cluster",
  17.         "Tags": [],
  18.         "TerminationProtected": false,
  19.         "RunningAmiVersion": "3.2.1",
  20.         "NormalizedInstanceHours": 16,
  21.         "InstanceGroups": [
  22.             {
  23.                 "RequestedInstanceCount": 1,
  24.                 "Status": {
  25.                     "Timeline": {
  26.                         "ReadyDateTime": 1413187775.749,
  27.                         "CreationDateTime": 1413187405.357
  28.                     },
  29.                     "State": "RUNNING",
  30.                     "StateChangeReason": {
  31.                         "Message": ""
  32.                     }
  33.                 },
  34.                 "Name": "MASTER",
  35.                 "InstanceGroupType": "MASTER",
  36.                 "InstanceType": "m5.xlarge",
  37.                 "Id": "ig-3ETXXXXXXFYV8",
  38.                 "Market": "ON_DEMAND",
  39.                 "RunningInstanceCount": 1
  40.             },
  41.             {
  42.                 "RequestedInstanceCount": 1,
  43.                 "Status": {
  44.                     "Timeline": {
  45.                         "ReadyDateTime": 1413187781.301,
  46.                         "CreationDateTime": 1413187405.357
  47.                     },
  48.                     "State": "RUNNING",
  49.                     "StateChangeReason": {
  50.                         "Message": ""
  51.                     }
  52.                 },
  53.                 "Name": "CORE",
  54.                 "InstanceGroupType": "CORE",
  55.                 "InstanceType": "m5.xlarge",
  56.                 "Id": "ig-3SUXXXXXXQ9ZM",
  57.                 "Market": "ON_DEMAND",
  58.                 "RunningInstanceCount": 1
  59.             }
  60. ...
  61. }
  ```

  要查看有关特定实例组的信息，请键入带有 `list-instances` 和 `--cluster-id` 参数的 `--instance-group-types` 子命令。您可以查看主实例组、核心实例组和任务实例组的信息。

  ```
  1. aws emr list-instances --cluster-id j-3KVXXXXXXY7UG --instance-group-types "CORE"
  ```

  使用带有 `modify-instance-groups` 参数的 `--instance-groups` 子命令可重置 `SUSPENDED` 状态下的集群。实例组 ID 通过 `describe-cluster` 子命令返回。

  ```
  1. aws emr modify-instance-groups --instance-groups InstanceGroupId=ig-3SUXXXXXXQ9ZM,InstanceCount=3
  ```

## 缩减集群大小时的注意事项
注意事项

如果您选择缩减正在运行的集群的大小，则请考虑以下 Amazon EMR 行为和最佳实践：
+ 为了减少对正在进行的作业的影响，Amazon EMR 会智能地选择要删除的实例。有关集群缩减行为更多信息，请参阅《Amazon EMR 管理指南》中的 [在任务完成时终止](emr-scaledown-behavior.md#emr-scaledown-terminate-task)。
+ 当您缩减集群的大小时，Amazon EMR 会将数据从其删除的实例复制到剩余的实例。确保组中剩余的实例中有足够的存储容量用于存储此数据。
+ Amazon EMR 尝试停用组中实例上的 HDFS。缩减集群大小之前，建议您尽量减少 HDFS 写入 I/O。
+ 要在缩减集群大小时进行最精细的控制，您可以在控制台中查看集群并导航到 **Instances**（实例）选项卡。选择要调整大小的实例组的 **ID**。然后对要删除的特定实例使用 **Terminate**（终止）选项。

# 配置预置超时以控制 Amazon EMR 中的容量
预调配超时

当您使用实例集时，您可以配置*预调配超时*。预调配超时指示 Amazon EMR 在集群启动或集群扩展操作期间集群超过指定的时间阈值时停止预调配实例容量。以下主题涵盖如何为集群启动和集群纵向扩展操作配置预调配超时。

**Topics**
+ [

# 在 Amazon EMR 中为集群启动预调配超时
](emr-provisioning-timeout-launch.md)
+ [

# 在 Amazon EMR 中自定义集群大小调整的预调配超时期限
](emr-provisioning-timeout-resize.md)

# 在 Amazon EMR 中为集群启动预调配超时
为启动预调配超时

您可以为集群中的每个实例集定义预调配竞价型实例的超时期限。如果 Amazon EMR 无法预调配 Spot 容量，您可以改为选择终止集群或预调配按需容量。如果超时期限在集群大小调整过程中结束，则 Amazon EMR 将取消未预调配的 Spot 请求。未预调配的竞价型实例不会转移到按需容量。

执行以下步骤，自定义使用 Amazon EMR 控制台启动集群的预调配超时期限。

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

**使用控制台创建集群时配置预置超时**

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

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

1. 在**创建集群**页面上，导航到**集群配置**并选择**实例集**。

1. 在**集群扩展和预调配选项**下，为您的核心和任务实例集指定 Spot 大小。

1. 在 **Spot 超时配置**下，选择**在 Spot 超时后终止集群**或**在 Spot 超时后切换到按需**。然后，指定预调配竞价型实例的超时期限。默认值为 1 小时。

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

1. 要启动具有已配置超时的集群，选择**创建集群**。

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

**要使用 `create-cluster` 命令指定预调配超时**

```
aws emr create-cluster \
--release-label emr-5.35.0 \
--service-role EMR_DefaultRole \
--ec2-attributes '{"InstanceProfile":"EMR_EC2_DefaultRole","SubnetIds":["subnet-XXXXX"]}' \
--instance-fleets '[{"InstanceFleetType":"MASTER","TargetOnDemandCapacity":1,"TargetSpotCapacity":0,"LaunchSpecifications":{"OnDemandSpecification":{"AllocationStrategy":"lowest-price"}},"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":100,"InstanceType":"m5.xlarge"}],"Name":"Master - 1"},{"InstanceFleetType":"CORE","TargetOnDemandCapacity":1,"TargetSpotCapacity":1,"LaunchSpecifications":{"SpotSpecification":{"TimeoutDurationMinutes":120,"TimeoutAction":"SWITCH_TO_ON_DEMAND"},"OnDemandSpecification":{"AllocationStrategy":"lowest-price"}},"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":1,"InstanceType":"m5.xlarge"}],"Name":"Core - 2"}]'
```

------

# 在 Amazon EMR 中自定义集群大小调整的预调配超时期限
为调整大小预调配超时

您可以为集群中的每个实例集定义预调配竞价型实例的超时期限。如果 Amazon EMR 无法预调配 Spot 容量，则它将取消调整大小请求并停止尝试预调配额外的 Spot 容量。创建集群时，您可以配置超时。对于正在运行的集群，您可以添加或更新超时。

超时时间到期后，Amazon EMR 会自动将事件发送到亚马逊 CloudWatch 事件流。使用 CloudWatch，您可以创建根据指定模式匹配事件的规则，然后将事件路由到目标以采取行动。例如，您可以将规则配置为发送电子邮件通知。有关如何创建规则的更多信息，请参阅[使用为 Amazon EMR 事件创建规则 CloudWatch](emr-events-cloudwatch-console.md)。有关不同事件详细信息的更多信息，请参阅[实例集状态更改事件](emr-manage-cloudwatch-events.md#emr-cloudwatch-instance-fleet-events)。

## 为集群大小调整预调配超时的示例
示例 (Amazon CLI)

**使用 Amazon CLI命令为调整大小指定预调配超时**

以下示例使用 `create-cluster` 命令为调整大小添加预调配超时。

```
aws emr create-cluster \
--release-label emr-5.35.0 \
--service-role EMR_DefaultRole \
--ec2-attributes '{"InstanceProfile":"EMR_EC2_DefaultRole","SubnetIds":["subnet-XXXXX"]}' \
--instance-fleets '[{"InstanceFleetType":"MASTER","TargetOnDemandCapacity":1,"TargetSpotCapacity":0,"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":100,"InstanceType":"m5.xlarge"}],"Name":"Master - 1"},{"InstanceFleetType":"CORE","TargetOnDemandCapacity":1,"TargetSpotCapacity":1,"LaunchSpecifications":{"SpotSpecification":{"TimeoutDurationMinutes":120,"TimeoutAction":"SWITCH_TO_ON_DEMAND"},"OnDemandSpecification":{"AllocationStrategy":"lowest-price"}},"ResizeSpecifications":{"SpotResizeSpecification":{"TimeoutDurationMinutes":20},"OnDemandResizeSpecification":{"TimeoutDurationMinutes":25}},"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":1,"InstanceType":"m5.xlarge"}],"Name":"Core - 2"}]'
```

以下示例使用 `modify-instance-fleet` 命令为调整大小添加预调配超时。

```
aws emr modify-instance-fleet \
--cluster-id j-XXXXXXXXXXXXX \
--instance-fleet '{"InstanceFleetId":"if-XXXXXXXXXXXX","ResizeSpecifications":{"SpotResizeSpecification":{"TimeoutDurationMinutes":30},"OnDemandResizeSpecification":{"TimeoutDurationMinutes":60}}}' \
--region us-east-1
```

以下示例使用 `add-instance-fleet-command` 为调整大小添加预调配超时。

```
aws emr add-instance-fleet \
--cluster-id j-XXXXXXXXXXXXX \
--instance-fleet '{"InstanceFleetType":"TASK","TargetOnDemandCapacity":1,"TargetSpotCapacity":0,"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":100,"InstanceType":"m5.xlarge"}],"Name":"TaskFleet","ResizeSpecifications":{"SpotResizeSpecification":{"TimeoutDurationMinutes":30},"OnDemandResizeSpecification":{"TimeoutDurationMinutes":35}}}' \
--region us-east-1
```

**为调整大小和启动指定置备超时时间 Amazon CLI**

以下示例使用 `create-cluster` 命令为调整大小和启动添加预调配超时。

```
aws emr create-cluster \
--release-label emr-5.35.0 \
--service-role EMR_DefaultRole \
--ec2-attributes '{"InstanceProfile":"EMR_EC2_DefaultRole","SubnetIds":["subnet-XXXXX"]}' \
--instance-fleets '[{"InstanceFleetType":"MASTER","TargetOnDemandCapacity":1,"TargetSpotCapacity":0,"LaunchSpecifications":{"OnDemandSpecification":{"AllocationStrategy":"lowest-price"}},"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":100,"InstanceType":"m5.xlarge"}],"Name":"Master - 1"},{"InstanceFleetType":"CORE","TargetOnDemandCapacity":1,"TargetSpotCapacity":1,"LaunchSpecifications":{"SpotSpecification":{"TimeoutDurationMinutes":120,"TimeoutAction":"SWITCH_TO_ON_DEMAND"},"OnDemandSpecification":{"AllocationStrategy":"lowest-price"}},"ResizeSpecifications":{"SpotResizeSpecification":{"TimeoutDurationMinutes":20},"OnDemandResizeSpecification":{"TimeoutDurationMinutes":25}},"InstanceTypeConfigs":[{"WeightedCapacity":1,"EbsConfiguration":{"EbsBlockDeviceConfigs":[{"VolumeSpecification":{"SizeInGB":32,"VolumeType":"gp2"},"VolumesPerInstance":2}]},"BidPriceAsPercentageOfOnDemandPrice":1,"InstanceType":"m5.xlarge"}],"Name":"Core - 2"}]'
```

## 调整预调配超时大小的注意事项
注意事项

在为实例集配置集群预调配超时时，请考虑以下行为。
+ 您可以为竞价型实例和按需实例配置预调配超时。最小预调配超时为 5 分钟。最大预调配超时为 7 天。
+ 您只能为使用实例集的 EMR 集群配置预调配超时。您必须分别配置每个核心和任务实例集。
+ 创建集群时，您可以配置预调配超时。您可以为正在运行的集群添加超时或更新现有超时。
+ 如果您提交多个调整大小操作，则 Amazon EMR 会跟踪每个调整大小操作的预调配超时。例如，将集群的配置超时设置为*60*分钟。然后，*R1*按时提交调整大小操作*T1*。一次提交第二次调整大小操作*R2**T2*。R1 的配置超时到期时间为。*T1 \$1 60 minutes*R2 的配置超时到期时间为。*T2 \$1 60 minutes*
+ 如果您在超时到期之前提交新的纵向扩展大小调整操作，则 Amazon EMR 将继续尝试为您的 EMR 集群预调配容量。

# Amazon EMR 集群的集群缩减选项


**注意**  
自 Amazon EMR 发行版 5.10.0 起，不再支持缩减行为选项。因为 Amazon EC2 中引入了按秒计费，Amazon EMR 集群的默认缩减行为现在在任务完成时终止。

对于 Amazon EMR 发行版 5.1.0 到 5.9.1，有两种缩减行为选项：在用于 Amazon EC2 计费的实例小时边界终止，或者在任务完成时终止。从 Amazon EMR 发行版 5.10.0 开始，在实例小时边界处终止的设置已弃用，因为在 Amazon EC2 中引入了按秒计费。我们不建议在提供了此选项的版本中指定在实例小时边界终止。

**警告**  
如果您使用 Amazon CLI 来发出 a `modify-instance-groups``EC2InstanceIdsToTerminate`，则这些实例将立即终止，而不考虑这些设置，也不管在这些实例上运行的应用程序的状态如何。通过这种方式终止实例将面临数据丢失以及出现不可预测的集群行为的风险。

当指定在任务完成后终止时，Amazon EMR 首先将拒绝列出来自节点的任务，并耗尽这些任务，然后再终止 Amazon EC2 实例。对于指定的任一行为，Amazon EMR 都不会终止核心实例组中的 Amazon EC2 实例（如果这会导致 HDFS 受损）。

## 在任务完成时终止


Amazon EMR 让您能够在不影响工作负载的情况下缩减集群。在向下调整操作期间，Amazon EMR 会尝试正常停用核心节点和任务节点上的 YARN、HDFS 及其他守护进程，而不会丢失数据或中断任务。Amazon EMR 仅缩减已完成所分配的工作并处于空闲状态的实例组大小。对于 Y NodeManager ARN Graceful 停用，您可以手动调整节点等待停用的时间。

**注意**  
正常停用时，可能会丢失数据。请务必备份数据。

**重要**  
在正常更换运行状况不佳的核心实例期间，HDFS 数据可能会永久丢失。我们建议您始终备份数据。

使用 `YARN-site` 配置分类中的属性来设置此时间。要使用 Amazon EMR 发行版 5.12.0 及更高版本，请指定 `YARN.resourcemanager.nodemanager-graceful-decommission-timeout-secs` 属性。要使用早期的 Amazon EMR 发行版，请指定 `YARN.resourcemanager.decommissioning.timeout` 属性。

如果停止超时过后仍有容器或 YARN 应用程序在运行，则系统会强制停止此节点，且由 YARN 在其它节点上重新计划受影响的容器。默认值为 3600 秒 (1 小时)。您可以将此超时设为任意大的值，以强制自然缩减操作等待更长时间。有关更多信息，请参阅 Apache Hadoop 文档中的 [Graceful Decommission of YARN nodes](http://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/GracefulDecommission.html)（正常停止 YARN 节点）。

### 任务节点组


Amazon EMR 将智能地选择没有针对任何步骤或应用程序运行的任务的实例，并首先将这些实例从集群中删除。如果集群中的所有实例均处于使用状态，Amazon EMR 会等待实例上的任务完成，然后将其从集群中删除。默认等待时间为 1 小时。该值可通过 `YARN.resourcemanager.decommissioning.timeout` 设置进行更改。Amazon EMR 将动态使用此新设置。您可以将其设置为任意大数字，以确保 Amazon EMR 在缩减集群大小的同时不会终止任何任务。

### 核心节点组


在核心节点上，必须停用 YARN NodeManager 和 HDFS DataNode 守护程序才能减少实例组。对于 YARN，自然缩减可确保标记为停止的节点仅在没有挂起或未完成的容器或应用程序时才转换到 `DECOMMISSIONED` 状态。如果开始淘汰时，节点上没有任何正在运行的容器，淘汰会立即完成。

对于 HDFS，自然缩减可确保 HDFS 的目标容量大到足以容纳所有现有数据块。如果目标容量不够大，则只停止部分核心实例，以便剩余节点能够处理驻留在 HDFS 中的当前数据。您应确保额外的 HDFS 容量以允许进一步执行淘汰。在尝试减少实例组 I/O 之前，还应尽量减少写入量。写入过多 I/O 可能会延迟调整大小操作的完成。

另一个限制是默认复制因素：`/etc/hadoop/conf/hdfs-site` 内的 `dfs.replication`。创建集群时，Amazon EMR 会根据集群中的实例数来配置此值：1-3 个实例为 `1`；4-9 个实例的集群为 `2`；10 个以上实例的集群为 `3`。

**警告**  
如果单个节点出现故障，则在少于四个节点的集群上将 `dfs.replication` 设置为 1 可能会导致 HDFS 数据丢失。建议您使用具有至少四个核心节点的集群来处理生产工作负载。
Amazon EMR 不允许集群扩展 `dfs.replication` 下方的核心节点。例如，如果是 `dfs.replication = 2`，则最小核心节点数为 2。
当您使用托管扩缩、自动扩缩或选择手动调整集群大小时，建议您将设置 `dfs.replication` 为 2 或更高。

自然缩减不允许您将核心节点减少到低于 HDFS 复制因子。这是为了允许 HDFS 因副本不足而关闭文件。要规避此限制，请降低重复因子并重新启动NameNode 守护程序。

# 配置 Amazon EMR 缩减行为


**注意**  
Amazon EMR 发行版 5.10.0 及更高版本不再支持在实例小时终止缩减行为选项。以下缩减行为选项仅在 Amazon EMR 控制台发行版 5.1.0 到 5.9.1 中显示。

在创建集群时 Amazon Web Services 管理控制台，您可以使用 Amazon CLI、或 Amazon EMR API 来配置缩减行为。

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

**使用控制台配置缩减行为**

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

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

1. 在**集群扩展和预置选项**部分，选择**使用自定义自动扩展**。在**自定义自动扩展策略**下，选择**加号操作按钮**以添加**横向缩减**策略。建议您同时添加**横向缩减**和**横向扩展**策略。仅添加一组策略意味着 Amazon EMR 只能执行单向扩展，您必须手动执行其他操作。

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

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

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

**使用配置缩小行为 Amazon CLI**
+ 使用 `--scale-down-behavior` 选项指定 `TERMINATE_AT_INSTANCE_HOUR` 或 `TERMINATE_AT_TASK_COMPLETION`。

------

# 终止处于启动、运行或等待状态的 Amazon EMR 集群


**警告**  
已终止的 EMR 集群不可恢复。移除之前，请确保不再需要 HDFS 或 Jupyter Notebook 上的资源和任何数据。集群终止时，HDFS 数据会丢失。

此部分介绍终止集群的方法。有关启用终止保护和自动终止集群的信息，请参阅[控制 Amazon EMR 集群终止](emr-plan-termination.md)。您可以在 `STARTING`、`RUNNING` 或 `WAITING` 状态下终止集群。`WAITING` 状态下的集群必须终止，否则会无限期地运行，给您的账户产生费用。您可以终止无法离开 `STARTING` 状态或不能完成步骤的集群。

如果要终止已开启终止保护的集群，则必须首先禁用终止保护，然后才能终止集群。可以使用控制台终止集群，也可以使用 `TerminateJobFlows` API 以编程方式终止集群。 Amazon CLI

根据集群配置，集群完全终止并释放已分配的资源 (如 EC2 实例) 可能需要 5 至 20 分钟。

**注意**  
您无法重新启动已终止的集群，但可以克隆已终止的集群，将其配置重用于新集群。有关更多信息，请参阅 [使用控制台克隆 Amazon EMR 集群](clone-console.md)。

**重要**  
Amazon EMR 使用 [Amazon EMR 服务角色](emr-iam-role.md) 和 `AWSServiceRoleForEMRCleanup` 角色来清理账户中不再使用的集群资源，例如 Amazon EC2 实例。您必须在角色策略包含删除或终止资源所需的操作。否则，Amazon EMR 将无法执行这些清理操作，并且集群上剩余的未使用资源可能会产生费用。

## 使用控制台终止集群
通过控制台终止

您可以使用 Amazon EMR 控制台终止一个或多个集群。在控制台中终止集群的步骤根据是否打开了终止保护而有所不同。要终止已保护的集群，您必须首先禁用终止保护。

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

**使用控制台终止集群**

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

1. 选择 **Clusters**（集群），然后选择要终止的集群。

1. 在 **Actions**（操作）下拉菜单下，选择 **Terminate cluster**（终止集群）以打开 **Terminate cluster**（终止集群）提示。

1. 出现提示时，选择 **Terminate**（终止）。根据集群配置，终止可能需要 5 至 10 分钟。有关如何终止 Amazon EMR 集群的更多信息，请参阅 [终止处于启动、运行或等待状态的 Amazon EMR 集群](#UsingEMR_TerminateJobFlow)。

------

## 使用终止集群 Amazon CLI
通过 CLI 终止

**要终止未受保护的群集，请使用 Amazon CLI**

要使用终止未受保护的集群 Amazon CLI，请使用带有--cluster-ids 参数的`terminate-clusters`子命令。
+ 键入以下命令以终止单个集群并*j-3KVXXXXXXX7UG*替换为您的集群 ID。

  ```
  1. aws emr terminate-clusters --cluster-ids j-3KVXXXXXXX7UG
  ```

  要终止多个集群，请键入以下命令*j-3KVXXXXXXX7UG*并*j-WJ2XXXXXX8EU*用您的集群替换和 IDs。

  ```
  1. aws emr terminate-clusters --cluster-ids j-3KVXXXXXXX7UG j-WJ2XXXXXX8EU
  ```

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

**要终止受保护的集群，请使用 Amazon CLI**

要使用终止受保护的集群 Amazon CLI，请先使用带`--no-termination-protected`参数的`modify-cluster-attributes`子命令禁用终止保护。然后使用带 `terminate-clusters` 参数的 `--cluster-ids` 子命令终止该集群。

1. 键入以下命令以禁用终止保护并*j-3KVTXXXXXX7UG*替换为您的集群 ID。

   ```
   1. aws emr modify-cluster-attributes --cluster-id j-3KVTXXXXXX7UG --no-termination-protected
   ```

1. 要终止集群，请键入以下命令并*j-3KVXXXXXXX7UG*替换为您的集群 ID。

   ```
   1. aws emr terminate-clusters --cluster-ids j-3KVXXXXXXX7UG
   ```

   要终止多个集群，请键入以下命令*j-3KVXXXXXXX7UG*并*j-WJ2XXXXXX8EU*用您的集群替换和 IDs。

   ```
   1. aws emr terminate-clusters --cluster-ids j-3KVXXXXXXX7UG j-WJ2XXXXXX8EU
   ```

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

## 使用 API 终止集群
通过 API 终止

`TerminateJobFlows` 操作结束步骤处理，从 Amazon EC2 向 Amazon S3（如果已配置）上载任何日志数据，并终止 Hadoop 集群。如果您在 `KeepJobAliveWhenNoSteps` 请求中将 `False` 设置为 `RunJobFlows`，集群也可以自动终止。

您可以使用此操作来终止单个集群，也可以按其集群终止集群列表 IDs。

有关独有的输入参数的更多信息`TerminateJobFlows`，请参阅[ TerminateJobFlows](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/API_TerminateJobFlows.html)。有关该请求中通用参数的更多信息，请参见[通用请求参数](https://docs.amazonaws.cn/ElasticMapReduce/latest/API/CommonParameters.html)。

# 使用控制台克隆 Amazon EMR 集群
克隆集群

您可以使用 Amazon EMR 控制台克隆集群，从而复制原始集群的配置，用作新集群的基础。

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

**使用控制台克隆集群**

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

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

1.  *从集群列表中克隆集群*

   1. 使用搜索和筛选条件选项，在列表视图中查找要克隆的集群。

   1. 选中要克隆的集群所在行左侧的复选框。

   1. **Clone**（克隆）选项将在列表视图顶部显示。选择 **Clone**（克隆）以启动克隆过程。如果集群已配置步骤，请选择 **Include steps**（包含步骤），如果要克隆这些步骤以及其他集群配置，请选择 **Continue**（继续）。

   1. 查看从克隆集群复制的新集群设置。请根据需要调整设置。如果对新集群的配置满意，请选择 **Create cluster**（创建集群）以启动新集群。

1. *从集群详细信息页面克隆集群*

   1. 要导航到要克隆的集群的详细信息页面，请从集群列表视图中选择其 **Cluster ID**（集群 ID）。

   1. 在集群详细信息页面顶部，从 **Actions**（操作）菜单中选择 **Clone cluster**（克隆集群）以启动克隆过程。如果集群已配置步骤，请选择 **Include steps**（包含步骤），如果要克隆这些步骤以及其他集群配置，请选择 **Continue**（继续）。

   1. 查看从克隆集群复制的新集群设置。请根据需要调整设置。如果对新集群的配置满意，请选择 **Create cluster**（创建集群）以启动新集群。

------

# 使用自动执行重复出现的 Amazon EMR 集群 Amazon Data Pipeline


**注意**  
Amazon Data Pipeline 不再向新客户开放。 Amazon Data Pipeline 的现有客户可以继续照常使用该服务。

 Amazon Data Pipeline 是一项自动移动和转换数据的服务。您可以使用它安排将输入数据移入 Amazon S3 的时间，以及安排启动集群处理这些数据的时间。例如，在拥有 Web 服务器记录流量日志的情况下可以考虑此项服务。如果您想每周运行一个集群来分析流量数据，则可以使用 Amazon Data Pipeline 来安排这些集群。 Amazon Data Pipeline 是一个数据驱动的工作流程，因此一项任务（启动集群）可以依赖于另一项任务（将输入数据移至 Amazon S3）。此外，它还拥有强健的重试功能。

 有关以下内容的更多信息 Amazon Data Pipeline，请参阅[Amazon Data Pipeline 开发人员指南](https://docs.amazonaws.cn/datapipeline/latest/DeveloperGuide/what-is-datapipeline.html)，尤其是有关 Amazon EMR 的教程：
+  [教程: 启动 Amazon EMR 任务流](https://docs.amazonaws.cn/datapipeline/latest/DeveloperGuide/dp-launch-emr-jobflow.html) 
+  [入门：使用 Amazon Data Pipeline、Amazon EMR 和 Hive 处理网络日志](https://docs.amazonaws.cn/datapipeline/latest/DeveloperGuide/dp-process-logs.html) 
+  [教程：使用亚马逊 DynamoDB 导入和导出 Amazon Data Pipeline](https://docs.amazonaws.cn/datapipeline/latest/DeveloperGuide/dp-importexport-ddb.html) 