

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

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

**重要**  
我们强烈建议您使用最新的亚马逊 EMR 版本（亚马逊 EMR 7.13.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>
+ 在下文中 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

## 托管扩展参数
<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.amazonaws.cn/emr/latest/APIReference/API_ComputeLimits.html](https://docs.amazonaws.cn/emr/latest/APIReference/API_ComputeLimits.html)。

## Amazon EMR 托管式自动扩缩功能注意事项
<a name="emr-managed-scaling-considerations"></a>
+ 有限版本 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 及更高版本。

## 功能历史记录
<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 及更高版本 | 