

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

# Amazon EMR 與 EC2 放置群組整合
<a name="emr-plan-ha-placementgroup"></a>

在 Amazon EC2 上啟動 Amazon EMR 多個主節點叢集時，您可以選擇使用放置群組策略來指定希望如何部署主節點執行個體以防止硬體故障。

從 Amazon EMR 5.23.0 版開始，支援放置群組策略作為多個主節點叢集的選項。目前，放置群組策略僅支援主節點類型，且 `SPREAD` 策略會套用至這些主節點。`SPREAD` 策略將一小組執行個體放置在單獨的基礎硬體上，以防止在發生硬體故障時遺失多個主節點。請注意，如果沒有足夠的唯一硬體來滿足請求，執行個體啟動請求可能會失敗。如需 EC2 放置策略和限制的詳細資訊，請參閱《EC2 Linux 執行個體使用者指南》**中的[放置群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html)。

Amazon EC2 的初始限制為 500 個置放群組策略啟用的叢集，每個 AWS 區域都可以啟動。請聯絡 AWS 支援，請求增加允許的置放群組數量。您可以透過追蹤 Amazon EMR 與 Amazon EMR 放置群組策略關聯的金鑰值對，來識別 Amazon EMR 建立的 EC2 放置群組。如需有關 EC2 叢集執行個體標籤的詳細資訊，請參閱 [檢視 Amazon EC2 中的叢集執行個體](UsingEMR_Tagging.md)。

## 將置放群組受管政策連接至 Amazon EMRrole
<a name="emr-plan-ha-launch-pg-policy"></a>

放置群組策略需要稱為 `AmazonElasticMapReducePlacementGroupPolicy` 的受管政策，該政策允許 Amazon EMR 在 Amazon EC2 上建立、刪除和描述放置群組。在啟動具有多個主節點的 Amazon EMR 叢集之前，您必須將 `AmazonElasticMapReducePlacementGroupPolicy` 連接至 Amazon EMR 的服務角色。

您也可以將 `AmazonEMRServicePolicy_v2` 受管政策附接至 Amazon EMR 服務角色而非放置群組受管政策。`AmazonEMRServicePolicy_v2` 允許對 Amazon EC2 上的放置群組進行與 `AmazonElasticMapReducePlacementGroupPolicy` 相同的存取。如需詳細資訊，請參閱[Amazon EMR 的服務角色 (EMR 角色)](emr-iam-role.md)。

`AmazonElasticMapReducePlacementGroupPolicy` 受管政策為 Amazon EMR 建立和管理的下列 JSON 文字。

**注意**  
由於 `AmazonElasticMapReducePlacementGroupPolicy` 受管政策會自動更新，此處所示的政策可能已過期。使用 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 EMR API 或 CLI，以 `placement-group-configs` 參數啟動具有多個主節點的 Amazon EMR 叢集，則只有在 Amazon EMR 角色已連接放置群組受管政策 `AmazonElasticMapReducePlacementGroupPolicy` 時，Amazon EMR 才會啟動該叢集。如果 Amazon EMR 角色未連接該政策，則具有多個主節點的 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 金鑰對名稱。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 金鑰對名稱。EC2 金鑰對是選用的，且只有在您想要使用 SSH 存取叢集時才需要。
+ 使用您的子網路 ID 取代 *subnet-22XXXX01* 和 *subnet-22XXXX02*。

------

## 啟動具有多個主節點但沒有放置群組策略的叢集
<a name="emr-plan-ha-launch-no-pg-strategy"></a>

若要讓具有多個主節點的叢集啟動沒有放置群組策略的主節點，您需要執行下列其中一項：
+ 從 Amazon EMR 角色移除放置群組受管政策 `AmazonElasticMapReducePlacementGroupPolicy`，或
+ 使用 Amazon EMR API 或 CLI 選擇 `NONE` 作為放置群組策略，透過 `placement-group-configs` 參數啟動具有多個主節點的叢集。

------
#### [ 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 金鑰對名稱。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 金鑰對名稱。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"
         }
      ]
   }
}
```