

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

# Amazon EMR 与 EC2 置放群组的集成
<a name="emr-plan-ha-placementgroup"></a>

在 Amazon EC2 上启动 Amazon EMR 多主节点集群时，您可以选择使用置放群组策略，指定您希望部署的主节点实例，以防止硬件故障。

从 Amazon EMR 版本 5.23.0 开始支持置放群组策略，该策略可作为多主节点集群选项。目前，置放群组策略仅支持主节点类型，并会将 `SPREAD` 策略应用于这些主节点。`SPREAD` 策略将一小组实例放置在单独的基础硬件上，以防止发生硬件故障时出现多个主节点丢失的问题。请注意：如果没有足够的唯一硬件来满足请求，实例启动请求可能会失败。有关 EC2 置放策略和限制的更多信息，请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》**中的[置放群组](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)。

Amazon EC2 的初始限制是，每个 AWS 区域可以启动 500 个支持置放群组策略的集群。请联系 AWS 支持部门，请求增加允许的置放群组数量。通过跟踪 Amazon EMR 与 Amazon EMR 置放组策略关联的键值对，可以识别 Amazon EMR 创建的 EC2 置放组 EMR。有关 EC2 集群实例类型的更多信息，请参阅[查看 Amazon EC2 中的集群实例](UsingEMR_Tagging.md)。

## 将置放群组托管策略附加到 Amazon EMRrole
<a name="emr-plan-ha-launch-pg-policy"></a>

置放群组策略需要一个名为 `AmazonElasticMapReducePlacementGroupPolicy` 的托管式策略，以允许 Amazon EMR 在 Amazon EC2 上创建、删除和描述置放群组。您必须将 `AmazonElasticMapReducePlacementGroupPolicy` 附加到 Amazon EMR 的服务角色，然后才能启动具有多个主节点的 Amazon EMR 集群。

您还可以将 `AmazonEMRServicePolicy_v2` 托管式策略 附加到 Amazon EMR 服务角色，而不使用置放群组托管式策略。`AmazonEMRServicePolicy_v2` 会与 `AmazonElasticMapReducePlacementGroupPolicy` 一样授予访问 Amazon EC2 上置放群组的相同权限。有关更多信息，请参阅 [Amazon EMR 的服务角色（EMR 角色）](emr-iam-role.md)。

`AmazonElasticMapReducePlacementGroupPolicy` 托管式策略是由 Amazon EMR 创建和管理的以下 JSON 文本。

**注意**  
由于`AmazonElasticMapReducePlacementGroupPolicy`托管策略是自动更新的，因此此处显示的策略可能是 out-of-date。使用 AWS 管理控制台查看当前策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Resource": [
        "*"
      ],
      "Effect": "Allow",
      "Action": [
        "ec2:DeletePlacementGroup",
        "ec2:DescribePlacementGroups"
      ],
      "Sid": "AllowEC2Deleteplacementgroup"
    },
    {
      "Resource": [
        "arn:aws:ec2:*:*:placement-group/pg-*"
      ],
      "Effect": "Allow",
      "Action": [
        "ec2:CreatePlacementGroup"
      ],
      "Sid": "AllowEC2Createplacementgroup"
    }
  ]
}
```

------

## 使用置放群组策略启动具有多个主节点的 Amazon EMR 集群
<a name="emr-plan-ha-launch-pg-strategy"></a>

要使用置放群组策略启动具有多个主节点的 Amazon EMR 集群，请将置放群组托管策略 `AmazonElasticMapReducePlacementGroupPolicy` 附加到 Amazon EMR 角色。有关更多信息，请参阅 [将置放群组托管策略附加到 Amazon EMRrole](#emr-plan-ha-launch-pg-policy)。

每次使用此角色启动具有多个主节点的 Amazon EMR 集群时，Amazon EMR 都会尝试启动将 `SPREAD` 策略应用于其主节点的集群。如果您使用的角色未将置放群组托管式策略 `AmazonElasticMapReducePlacementGroupPolicy` 附加到自身，Amazon EMR 会尝试在没有置放群组策略的情况下启动具有多个主节点的 Amazon EMR 集群。

如果您使用 Amazon EMRAPI 或 CLI 启动具有多个主节点且`placement-group-configs`参数为的 Amazon EMR 集群，则只有在亚马逊附加了置放群组托管策略的情况下，A EMRrole mazon EMR 才会启动该集群。`AmazonElasticMapReducePlacementGroupPolicy`如果 Amazon EMRrole 未附加该策略，则具有多个主节点的 Amazon EMR 集群将启动失败。

------
#### [ Amazon EMR API ]

**Example 示例：使用置放群组策略从 Amazon EMR API 中启动具有多个主节点的实例组集群**  
当您使用 RunJobFlow 操作创建具有多个主节点的 Amazon EMR 集群时，请将该`PlacementGroupConfigs`属性设置为以下内容。目前，`MASTER` 实例角色会自动使用 `SPREAD` 作为置放群组策略。  

```
{
   "Name":"ha-cluster",
   "PlacementGroupConfigs":[
      {
         "InstanceRole":"MASTER"
      }
   ],
   "ReleaseLabel": emr-6.15.0,
   "Instances":{
      "ec2SubnetId":"subnet-22XXXX01",
      "ec2KeyName":"ec2_key_pair_name",
      "InstanceGroups":[
         {
            "InstanceCount":3,
            "InstanceRole":"MASTER",
            "InstanceType":"m5.xlarge"
         },
         {
            "InstanceCount":4,
            "InstanceRole":"CORE",
            "InstanceType":"m5.xlarge"
         }
      ]
   },
   "JobFlowRole":"EMR_EC2_DefaultRole",
   "ServiceRole":"EMR_DefaultRole"
}
```
+ *ha-cluster*替换为高可用性集群的名称。
+ *subnet-22XXXX01*替换为您的子网 ID。
+ 将替换为*ec2\$1key\$1pair\$1name*该集群的 EC2 key pair 的名称。EC2 密钥对是可选的，仅当您希望使用 SSH 访问集群时是必需的。

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

**Example 示例 — 使用置放群组策略启动包含多个主节点的实例队列集群 AWS Command Line Interface**  
当您使用 RunJobFlow 操作创建具有多个主节点的 Amazon EMR 集群时，请将该`PlacementGroupConfigs`属性设置为以下内容。目前，`MASTER` 实例角色会自动使用 `SPREAD` 作为置放群组策略。  

```
aws emr create-cluster \
--name "ha-cluster" \
--placement-group-configs InstanceRole=MASTER \
--release-label emr-6.15.0 \
--instance-fleets '[
    {
        "InstanceFleetType": "MASTER",
        "TargetOnDemandCapacity": 3,
        "TargetSpotCapacity": 0,
        "LaunchSpecifications": {
            "OnDemandSpecification": {
                "AllocationStrategy": "lowest-price"
            }
        },
        "InstanceTypeConfigs": [
            {
                "WeightedCapacity": 1,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.xlarge"
            },
            {
                "WeightedCapacity": 1,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.2xlarge"
            },
            {
                "WeightedCapacity": 1,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.4xlarge"
            }
        ],
        "Name": "Master - 1"
    },
    {
        "InstanceFleetType": "CORE",
        "TargetOnDemandCapacity": 5,
        "TargetSpotCapacity": 0,
        "LaunchSpecifications": {
            "OnDemandSpecification": {
                "AllocationStrategy": "lowest-price"
            }
        },
        "InstanceTypeConfigs": [
            {
                "WeightedCapacity": 1,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.xlarge"
            },
            {
                "WeightedCapacity": 2,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.2xlarge"
            },
            {
                "WeightedCapacity": 4,
                "BidPriceAsPercentageOfOnDemandPrice": 100,
                "InstanceType": "m5.4xlarge"
            }
        ],
        "Name": "Core - 2"
    }
]' \
--ec2-attributes '{
    "KeyName": "ec2_key_pair_name",
    "InstanceProfile": "EMR_EC2_DefaultRole",
    "SubnetIds": [
        "subnet-22XXXX01",
        "subnet-22XXXX02"
    ]
}' \
--service-role EMR_DefaultRole \
--applications Name=Hadoop Name=Spark
```
+ *ha-cluster*替换为高可用性集群的名称。
+ 将替换为*ec2\$1key\$1pair\$1name*该集群的 EC2 key pair 的名称。EC2 密钥对是可选的，仅当您希望使用 SSH 访问集群时是必需的。
+ 用您的子网替换*subnet-22XXXX01*和*subnet-22XXXX02*IDs。

------

## 在未附加置放群组策略的情况下启动多主节点集群
<a name="emr-plan-ha-launch-no-pg-strategy"></a>

要让多主节点集群在未附加置放群组策略的情况下启动主节点，您需要执行以下操作之一：
+ `AmazonElasticMapReducePlacementGroupPolicy`从 Amazon 中移除置放群组托管策略 EMRrole，或者
+ 使用 Amazon EMR API 或 CLI 通过 `placement-group-configs` 参数启动多主节点集群，选择 `NONE` 作为置放群组策略。

------
#### [ Amazon EMR API ]

**Example ：使用 Amazon EMR API 启动未附加置放群组策略的多主节点集群。**  
使用 RunJobFlow 操作创建具有多个主节点的集群时，请将该`PlacementGroupConfigs`属性设置为以下内容。  

```
{
   "Name":"ha-cluster",
   "PlacementGroupConfigs":[
      {
         "InstanceRole":"MASTER",
         "PlacementStrategy":"NONE"
      }
   ],
   "ReleaseLabel":"emr-5.30.1",
   "Instances":{
      "ec2SubnetId":"subnet-22XXXX01",
      "ec2KeyName":"ec2_key_pair_name",
      "InstanceGroups":[
         {
            "InstanceCount":3,
            "InstanceRole":"MASTER",
            "InstanceType":"m5.xlarge"
         },
         {
            "InstanceCount":4,
            "InstanceRole":"CORE",
            "InstanceType":"m5.xlarge"
         }
      ]
   },
   "JobFlowRole":"EMR_EC2_DefaultRole",
   "ServiceRole":"EMR_DefaultRole"
}
```
+ *ha-cluster*替换为高可用性集群的名称。
+ *subnet-22XXXX01*替换为您的子网 ID。
+ 将替换为*ec2\$1key\$1pair\$1name*该集群的 EC2 key pair 的名称。EC2 密钥对是可选的，仅当您希望使用 SSH 访问集群时是必需的。

------
#### [ Amazon EMR CLI ]

**Example ：使用 Amazon EMR CLI 启动未附加置放群组策略的多主节点集群。**  
使用 RunJobFlow 操作创建具有多个主节点的集群时，请将该`PlacementGroupConfigs`属性设置为以下内容。  

```
aws emr create-cluster \
--name "ha-cluster" \
--placement-group-configs InstanceRole=MASTER,PlacementStrategy=NONE \
--release-label emr-5.30.1 \
--instance-groups InstanceGroupType=MASTER,InstanceCount=3,InstanceType=m5.xlarge InstanceGroupType=CORE,InstanceCount=4,InstanceType=m5.xlarge \
--ec2-attributes KeyName=ec2_key_pair_name,InstanceProfile=EMR_EC2_DefaultRole,SubnetId=subnet-22XXXX01 \
--service-role EMR_DefaultRole \
--applications Name=Hadoop Name=Spark
```
+ *ha-cluster*替换为高可用性集群的名称。
+ *subnet-22XXXX01*替换为您的子网 ID。
+ 将替换为*ec2\$1key\$1pair\$1name*该集群的 EC2 key pair 的名称。EC2 密钥对是可选的，仅当您希望使用 SSH 访问集群时是必需的。

------

## 检查附加多主节点集群的置放群组策略配置
<a name="emr-plan-ha-check-pg-using-api"></a>

您可以使用 Amazon EMR 描述集群 API，来查看附加多主节点集群的置放群组策略配置。

**Example**  

```
aws emr describe-cluster --cluster-id "j-xxxxx"
{
   "Cluster":{
      "Id":"j-xxxxx",
      ...
      ...
      "PlacementGroups":[
         {
            "InstanceRole":"MASTER",
            "PlacementStrategy":"SPREAD"
         }
      ]
   }
}
```