

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用自動擴展搭配 Amazon EMR 中執行個體群組的自訂政策
<a name="emr-automatic-scaling"></a>

在 Amazon EMR 4.0 及更高版本中，使用自訂政策進行自動擴展，可讓您根據 CloudWatch 指標或您在*擴展政策*中所指定的其他參數，以程式設計方式橫向擴展或縮減核心節點和任務節點。自動擴展和自訂政策，可搭配執行個體群組設定，但在使用執行個體機群時不能搭配使用。如需執行個體群組和執行個體機群的詳細資訊，請參閱 [使用執行個體機群或統一執行個體群組建立 Amazon EMR 叢集](emr-instance-group-configuration.md)。

擴展政策屬於執行個體群組設定的一部分。您可以在初次設定執行個體群組時指定政策，或是修改既有叢集中的執行個體群組，即使執行個體群組處於使用中的狀態也無妨。除了主要執行個體群組外，叢集中的每個執行個體群組均擁有自己的擴展政策，包含橫向擴展和縮減規則。橫向擴充和縮減的規則可分開設定，每項規則均有不同的參數。

您可以使用 AWS 管理主控台、 AWS CLI或 Amazon EMR API 設定擴展政策。當您使用 AWS CLI 或 Amazon EMR API 時，請以 JSON 格式指定擴展政策。此外，使用 AWS CLI 或 Amazon EMR API 時，您可以指定自訂 CloudWatch 指標。使用 AWS 管理主控台時無法選取自訂指標。初次使用主控台建立擴展政策時，系統會預先設定好多數應用程式適用的預設政策，以協助您開始使用。這些預設規則均可刪除或修改。

即使自動調整規模可在不停機的狀態下調整 EMR 叢集容量，仍應考量基準工作負載需求並妥善規劃您的節點和執行個體群組設定。如需詳細資訊，請參閱[叢集組態指導方針](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 建立自訂自動擴展角色，建議您根據受管政策為自訂角色建立基本許可政策。如需詳細資訊，請參閱[設定服務和資源的 Amazon EMR 許可的 IAM 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)」。

以下是政策中每條規則用於決定自動調整規模行為的參數。

**注意**  
此處列出的參數是以 Amazon EMR AWS 管理主控台 的 為基礎。當您使用 AWS CLI 或 Amazon EMR API 時，可以使用其他進階組態選項。如需進階選項的詳細資訊，請參閱《Amazon EMR API 參考》**中的 [SimpleScalingPolicyConfiguration](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_PutAutoScalingPolicy.html)。
+ 執行個體上限與執行個體下限。**執行個體上限**限制可指定執行個體群組中存在的 Amazon EC2 執行個體的最大數量，並且會套用至所有橫向擴展規則。同樣地，**執行個體下限**限制可指定 Amazon EC2 執行個體的最小數量，並可套用至所有縮減規則。
+ **Rule name (規則名稱)**，在政策內必須是唯一的。
+ **scaling adjustment (規模調整)** 會決定受到規則觸發的擴展活動所要新增 (向外擴展規則) 或終止 (向內擴展規則) 的 EC2 執行個體數量。
+ **CloudWatch metric (CloudWatch 指標)**，用於監看警示條件。
+ **comparison operator (比較運算子)**，用於將 CloudWatch 指標與 **Threshold (閾值)** 的值進行比較，判定觸發的條件。
+ **evaluation period (評估時間)**，以五分鐘為單位遞增，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_tw/emr/latest/ManagementGuide/images/auto-scaling-rule-params.png)

## 考量和限制
<a name="emr-automatic-scaling-considerations"></a>
+ Amazon CloudWatch 指標對於 Amazon EMR 自動擴展功能的操作至關重要。建議您密切監控 Amazon CloudWatch 指標，以確保資料不會遺失。如需有關如何設定 Amazon CloudWatch 警示以偵測遺失指標的詳細資訊，請參閱[使用 Amazon CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。
+ EBS 磁碟區過度使用可能會導致受管擴展問題。建議密切監控 EBS 磁碟區的使用情況，以確保 EBS 磁碟區使用率低於 90%。如需有關指定其他 EBS 磁碟區的資訊，請參閱[執行個體儲存體](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-storage.html)。
+ 在 Amazon EMR 5.18 至 5.28 版中使用自訂政策進行自動擴展，可能會因為 Amazon 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 主控台，然後從側邊導覽選取**切換至舊主控台**。如需有關切換至舊主控台時預期情況的詳細資訊，請參閱[使用舊主控台](https://docs.aws.amazon.com/emr/latest/ManagementGuide/whats-new-in-console.html#console-opt-in)。

1. 若您是要建立叢集，請在 Amazon EMR 主控台中選取**建立叢集**，再選取**前往進階選項**，選擇**步驟 1：軟體和步驟**的選項，然後前往**步驟 2：硬體組態**。

   ** - 或 - **

   若您要修改執行中叢集內的執行個體群組，請在叢集清單中選取您的叢集，再展開 **Hardware (硬體)** 區段。

1. 在**叢集擴展和佈建選項**區段中，選取**啟用叢集擴展**。然後選取 **Create a custom automatic scaling policy (建立自訂自動擴展政策)**。

   在 **Custom automatic scaling policies (自訂自動擴展政策)** 表格中，按一下出現在所要設定執行個體群組資料列中的鉛筆圖示。「Auto Scaling 規則」畫面開啟。

1. 請輸入您希望執行個體群組在向外擴展完畢後的 **Maximum instances (執行個體上限)**，以及在向內擴展後的 **Minimum instances (執行個體下限)**。

1. 請按一下鉛筆圖示以編輯規則參數，按一下 **X** 可從政策中移除該條規則，按一下 **Add rule (新增規則)** 則可增加更多規則。

1. 按本主題之前的說明，選擇規則參數。如需 Amazon EMR 的可用 CloudWatch 指標的說明，請參閱《Amazon CloudWatch 使用者指南》**中的 [Amazon EMR 指標和維度](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/emr-metricscollected.html)。

## 使用 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` 命令建立。該角色只能在建立叢集時新增，且無法新增至既有的叢集。

如需有關設定自動擴展政策時可用參數的詳細說明，請參閱《Amazon EMR API 參考》**中的 [PutAutoScalingPolicy](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_PutAutoScalingPolicy.html)。

### 使用套用至執行個體群組的自動擴展政策來建立叢集
<a name="emr-autoscale-cli-createcluster"></a>

也可以在 `--instance-groups` 命令的 `aws emr create-cluster` 選項中指定自動調整規模的設定。以下範例所說明的建立叢集命令中，是以內嵌方式提供核心執行個體群組的自動調整規模政策。命令會建立相當於預設橫向擴展政策的擴展組態，該政策會在您使用適用於 Amazon EMR AWS 管理主控台 的 建立自動擴展政策時顯示。為了簡潔之故，不會顯示縮減政策。不建議建立不含縮減規則的橫向擴展規則。

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