

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

# 使用 Amazon EMR 集群扩展来适应不断变化的工作负载
<a name="emr-scale-on-demand"></a>

您可以自动或手动调整对 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  |  在定义自动扩展规则时，您可以选择支持哪些应用程序。  | 

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

# 在 Amazon EMR 中使用托管扩展
<a name="emr-managed-scaling"></a>

**重要**  
我们强烈建议您使用最新的亚马逊 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)。

## 概述
<a name="emr-managed-scaling-overview"></a>

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

## 托管式自动扩缩功能的可用性
<a name="emr-managed-scaling-availability"></a>
+ 在下文中 AWS 区域，亚马逊 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）
+ 在下文中 AWS 区域，亚马逊 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）
  + AWS GovCloud (美国东部) (us-gov-east-1)
  + AWS GovCloud (美国西部) (us-gov-west-1)
+ Amazon EMR 托管扩展仅适用于 YARN 应用程序，如 Spark、Hadoop、Hive 和 Flink。它不支持不基于 YARN 的应用程序，例如 Presto 和。 HBase

## 托管扩展参数
<a name="emr-managed-scaling-parameters"></a>

您必须为托管扩展配置以下参数。该限制仅适用于核心节点和任务节点。初始配置后，无法扩展主节点。
+ **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.aws.amazon.com/emr/latest/APIReference/API_ComputeLimits.html](https://docs.aws.amazon.com/emr/latest/APIReference/API_ComputeLimits.html)。

## Amazon EMR 托管式自动扩缩功能注意事项
<a name="emr-managed-scaling-considerations"></a>
+ 有限版本 AWS 区域 和 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://aws.amazon.com/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://aws.amazon.com/blogs/big-data/spark-enhancements-for-elasticity-and-resiliency-on-amazon-emr/)（有关 Amazon EMR 如何在节点停用期间与 YARN 拒绝名单集成的详细信息）、[拒绝列出的节点](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-troubleshoot-error-resource-3.html)以及[配置节点停用行为](https://docs.aws.amazon.com/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.aws.amazon.com/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.aws.amazon.com/emr/latest/ManagementGuide/emr-instance-group-configuration.html)、[集选项](https://docs.aws.amazon.com/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.aws.amazon.com/emr/latest/ManagementGuide/emr-man-sec-groups.html#emr-sg-elasticmapreduce-master-private)。
+ 您可以使用 AWS CloudFormation 来配置 Amazon EMR 托管扩展。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [AWS::EMR::Cluster](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-elasticmapreduce-cluster.html)。
+ 如果您使用的是竞价型节点，请考虑使用节点标签来防止 Amazon EMR 在 Amazon EMR 删除竞价型节点时删除应用程序进程。有关节点标签的更多信息，请参阅[任务节点](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html#emr-plan-task)。
+ Amazon EMR 6.15 或更低版本默认不支持节点标签。有关更多信息，请参阅[了解节点类型：主节点、核心节点和任务节点。](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-master-core-task-nodes.html)。
+ 如果您使用的是 Amazon EMR 6.15 或更低版本，则只能按节点类型分配节点标签，比如核心节点和任务节点。但是，如果您使用的是 Amazon EMR 7.0 或更高版本，则可以按节点类型和市场类型配置节点标签，比如按需型和竞价型。
+ 如果将应用程序进程限制为核心节点时，应用程序进程需求增加而执行程序需求减少，则可以在同一调整大小操作中重新添加核心节点并删除任务节点。有关更多信息，请参阅[了解节点分配策略和场景](https://docs.aws.amazon.com/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.aws.amazon.com/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 及更高版本。

## 功能历史记录
<a name="emr-managed-scaling-history"></a>

此表列出了对 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 配置托管扩展
<a name="managed-scaling-configure"></a>

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

**Topics**
+ [

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

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

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

## 使用 AWS 管理控制台 来配置托管扩展
<a name="managed-scaling-console"></a>

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

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

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

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

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

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

------

## 使用 AWS CLI 来配置托管扩展
<a name="managed-scaling-cli"></a>

创建集群时，您可以使用 Amazon EMR AWS 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 命令的更多信息 AWS CLI，请参阅。[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

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

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

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

## 用于配置 适用于 Java 的 AWS SDK 托管扩展
<a name="managed-scaling-sdk"></a>

以下程序摘要说明如何使用 适用于 Java 的 AWS 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 的高级扩展
<a name="managed-scaling-allocation-strategy-optimized"></a>

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

## 高级缩放设置
<a name="managed-scaling-allocation-strategy-optimized-strategies"></a>

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

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

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

## 高级缩放的好处
<a name="managed-scaling-allocation-strategy-optimized-benefits"></a>

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

## 开始使用优化
<a name="managed-scaling-allocation-strategy-optimized-getting-started"></a>

**设置和配置**

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

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

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

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

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


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

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

# 了解 Amazon EMR 节点分配策略和场景
<a name="managed-scaling-allocation-strategy"></a>

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

## 节点分配策略
<a name="node-allocation-strategy"></a>

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.aws.amazon.com/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 会取消移除实例，并执行纵向扩展操作。

## 节点分配注意事项
<a name="node-allocation-considerations"></a>

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

## 节点分配方案
<a name="node-allocation-scenarios"></a>

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

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

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

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

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

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

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

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

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_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.aws.amazon.com/zh_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.aws.amazon.com/zh_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.aws.amazon.com/zh_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.aws.amazon.com/zh_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.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/managed-scaling-allocation-strategy.html)

# 了解 Amazon EMR 中的托管扩展指标
<a name="managed-scaling-metrics"></a>

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

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


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

## 绘制托管扩展指标的图表
<a name="managed-scaling-graphic"></a>

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

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

1. 打开 [CloudWatch 控制台](https://console.aws.amazon.com/cloudwatch/)。

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

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

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

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

![\[绘制托管扩展指标的图形\]](http://docs.aws.amazon.com/zh_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.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/Managed_Scaling_Metrics.png)


# 将自动扩展与 Amazon EMR 中实例组的自定义策略结合使用
<a name="emr-automatic-scaling"></a>

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

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

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

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

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

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

## 为自动伸缩功能创建 IAM 角色
<a name="emr-automatic-scaling-iam-role"></a>

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

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

## 了解自动伸缩角色
<a name="emr-scaling-rules"></a>

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

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

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

**注意**  
此处列出的参数基于 AWS 管理控制台 适用于 Amazon EMR 的。当您使用 AWS CLI 或 Amazon EMR API 时，还有其他高级配置选项可用。有关高级选项的更多信息，请参阅 *Amazon EMR API* 参考[SimpleScalingPolicyConfiguration](https://docs.aws.amazon.com/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.aws.amazon.com/autoscaling/ec2/userguide/Cooldown.html)。  
![\[AWS 管理控制台 Amazon EMR 的自动扩展规则参数。\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/auto-scaling-rule-params.png)

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

## 使用配置 AWS 管理控制台 自动缩放
<a name="emr-automatic-scale-console"></a>

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

1. 导航到 Amazon EMR 新控制台，然后从侧面导航栏中选择**切换到旧控制台**。有关切换到旧控制台后预期情况的更多信息，请参阅 [Using the old console](https://docs.aws.amazon.com/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.aws.amazon.com/AmazonCloudWatch/latest/monitoring/emr-metricscollected.html)。 CloudWatch *

## 使用配置 AWS CLI 自动缩放
<a name="emr-automatic-scale-cli"></a>

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

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

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

### 创建具有已应用于实例组的自动伸缩策略的集群
<a name="emr-autoscale-cli-createcluster"></a>

您可在 `aws emr create-cluster` 命令的 `--instance-groups` 选项内指定自动扩展配置。以下示例说明了一个 create-cluster 命令，其中以内联方式提供核心实例组的自动扩展策略。该命令创建的扩展配置等同于默认的横向扩展策略，当您使用 for AWS 管理控制台 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}"
             }
          ]
        }
       }
      }
     ]
   }
}
]
```

### 将具有自动伸缩策略的实例组添加到集群
<a name="emr-autoscale-cli-createinstancegroup"></a>

您可以将 `--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
```

### 向现有实例组应用自动伸缩策略或修改已应用的策略
<a name="emr-autoscale-cli-modifyinstancegroup"></a>

使用 `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"
                          }
                  }
          }]
  }
```

### 从实例组中删除自动伸缩策略
<a name="emr-autoscale-cli-removepolicy"></a>

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

### 检索自动伸缩策略配置
<a name="emr-autoscale-cli-getpolicy"></a>

该`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 集群的大小
<a name="emr-manage-resize"></a>

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

## 使用控制台调整集群大小
<a name="resize-console"></a>

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

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

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

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/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 (正在运行)**。

## 使用调整集群的大小 AWS CLI
<a name="ResizingParameters"></a>

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

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

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

您可以将实例添加到核心组或任务组，也可以使用带`InstanceCount`参数的 AWS 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
  ```

  使用 AWS 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 命令的更多信息 AWS CLI，请参阅。[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

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

使用 AWS CLI，您可以使用子命令将 1 到 48 个任务实例组添加到集群中。`--add-instance-groups`任务实例组只能添加到包含主实例组和核心实例组的集群。使用时 AWS 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 命令的更多信息 AWS CLI，请参阅。[https://docs.aws.amazon.com/cli/latest/reference/emr](https://docs.aws.amazon.com/cli/latest/reference/emr)

## 中断调整
<a name="interruptible-resize"></a>

通过使用 Amazon EMR 4.1.0 版或更高版本，您可以在现有大小调整操作执行期间下达新的大小调整指示。此外，您可以停止之前提交的调整请求，或提交新请求以覆盖之前的请求，而不必等待其完成。您还可以从控制台或使用 `ModifyInstanceGroups` API 调用停止现有的大小调整操作，并将当前计数作为目标集群数。

下面的屏幕截图显示了正在调整但可通过选择 **Stop (停止)** 来停止的任务实例组。

![\[Task instance group showing resizing status with options to resize or stop.\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/resize-stop.png)


**使用中断调整大小 AWS CLI**

您可以使用`modify-instance-groups`子命令 AWS 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 请求有所变化。对于缩减请求，如果节点上有正在进行的工作，则在节点完成其工作前，实例组不会缩减。

## “暂停”状态
<a name="emr-manage-resizeSuspended"></a>

如果尝试启动新的集群节点时遇到太多错误，实例组就会进入“暂停”状态。例如，如果新节点在执行引导操作时出现故障，实例组会进入 *SUSPENDED (暂停)* 状态，而不是持续地预置新节点。解决了基础问题后，您可以重置集群实例组上所需数量的节点，然后实例组继续开始分配节点。修改实例组会促使 Amazon EMR 尝试再次预置节点。没有重启或终止任何运行节点。

在中 AWS CLI，`list-instances`子命令和`describe-cluster`子命令一样返回所有实例及其状态。如果 Amazon EMR 检测到实例组故障，则组的状态会更改为 `SUSPENDED`。

**使用重置处于 “已暂停” 状态的集群 AWS 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
  ```

## 缩减集群大小时的注意事项
<a name="resize-considerations"></a>

如果您选择缩减正在运行的集群的大小，则请考虑以下 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 中的容量
<a name="emr-provisioning-timeout"></a>

当您使用实例集时，您可以配置*预调配超时*。预调配超时指示 Amazon EMR 在集群启动或集群扩展操作期间集群超过指定的时间阈值时停止预调配实例容量。以下主题涵盖如何为集群启动和集群纵向扩展操作配置预调配超时。

**Topics**
+ [

# 在 Amazon EMR 中为集群启动预调配超时
](emr-provisioning-timeout-launch.md)
+ [

# 在 Amazon EMR 中自定义集群大小调整的预调配超时期限
](emr-provisioning-timeout-resize.md)

# 在 Amazon EMR 中为集群启动预调配超时
<a name="emr-provisioning-timeout-launch"></a>

您可以为集群中的每个实例集定义预调配竞价型实例的超时期限。如果 Amazon EMR 无法预调配 Spot 容量，您可以改为选择终止集群或预调配按需容量。如果超时期限在集群大小调整过程中结束，则 Amazon EMR 将取消未预调配的 Spot 请求。未预调配的竞价型实例不会转移到按需容量。

执行以下步骤，自定义使用 Amazon EMR 控制台启动集群的预调配超时期限。

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

**使用控制台创建集群时配置预置超时**

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

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

1. 在**创建集群**页面上，导航到**集群配置**并选择**实例集**。

1. 在**集群扩展和预调配选项**下，为您的核心和任务实例集指定 Spot 大小。

1. 在 **Spot 超时配置**下，选择**在 Spot 超时后终止集群**或**在 Spot 超时后切换到按需**。然后，指定预调配竞价型实例的超时期限。默认值为 1 小时。

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

1. 要启动具有已配置超时的集群，选择**创建集群**。

------
#### [ AWS 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 中自定义集群大小调整的预调配超时期限
<a name="emr-provisioning-timeout-resize"></a>

您可以为集群中的每个实例集定义预调配竞价型实例的超时期限。如果 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)。

## 为集群大小调整预调配超时的示例
<a name="emr-provisioning-timeout-examples"></a>

**使用 AWS 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
```

**为调整大小和启动指定置备超时时间 AWS 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"}]'
```

## 调整预调配超时大小的注意事项
<a name="emr-provisioning-timeout-considerations"></a>

在为实例集配置集群预调配超时时，请考虑以下行为。
+ 您可以为竞价型实例和按需实例配置预调配超时。最小预调配超时为 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 集群的集群缩减选项
<a name="emr-scaledown-behavior"></a>

**注意**  
自 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 中引入了按秒计费。我们不建议在提供了此选项的版本中指定在实例小时边界终止。

**警告**  
如果您使用 AWS CLI 来发出 a `modify-instance-groups``EC2InstanceIdsToTerminate`，则这些实例将立即终止，而不考虑这些设置，也不管在这些实例上运行的应用程序的状态如何。通过这种方式终止实例将面临数据丢失以及出现不可预测的集群行为的风险。

当指定在任务完成后终止时，Amazon EMR 首先将拒绝列出来自节点的任务，并耗尽这些任务，然后再终止 Amazon EC2 实例。对于指定的任一行为，Amazon EMR 都不会终止核心实例组中的 Amazon EC2 实例（如果这会导致 HDFS 受损）。

## 在任务完成时终止
<a name="emr-scaledown-terminate-task"></a>

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 节点）。

### 任务节点组
<a name="emr-scaledown-task-nodes"></a>

Amazon EMR 将智能地选择没有针对任何步骤或应用程序运行的任务的实例，并首先将这些实例从集群中删除。如果集群中的所有实例均处于使用状态，Amazon EMR 会等待实例上的任务完成，然后将其从集群中删除。默认等待时间为 1 小时。该值可通过 `YARN.resourcemanager.decommissioning.timeout` 设置进行更改。Amazon EMR 将动态使用此新设置。您可以将其设置为任意大数字，以确保 Amazon EMR 在缩减集群大小的同时不会终止任何任务。

### 核心节点组
<a name="emr-scaledown-core-nodes"></a>

在核心节点上，必须停用 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 缩减行为
<a name="emr-scaledown-configure"></a>

**注意**  
Amazon EMR 发行版 5.10.0 及更高版本不再支持在实例小时终止缩减行为选项。以下缩减行为选项仅在 Amazon EMR 控制台发行版 5.1.0 到 5.9.1 中显示。

在创建集群时 AWS 管理控制台，您可以使用 AWS CLI、或 Amazon EMR API 来配置缩减行为。

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

**使用控制台配置缩减行为**

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

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

1. 在**集群扩展和预置选项**部分，选择**使用自定义自动扩展**。在**自定义自动扩展策略**下，选择**加号操作按钮**以添加**横向缩减**策略。建议您同时添加**横向缩减**和**横向扩展**策略。仅添加一组策略意味着 Amazon EMR 只能执行单向扩展，您必须手动执行其他操作。

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

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

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

**使用配置缩小行为 AWS CLI**
+ 使用 `--scale-down-behavior` 选项指定 `TERMINATE_AT_INSTANCE_HOUR` 或 `TERMINATE_AT_TASK_COMPLETION`。

------