

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

# 将自动扩展与 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."
            }
        }
    }
}
```