

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

# 在 Amazon EMR 中将容量预留与实例集结合使用
<a name="on-demand-capacity-reservations"></a>

要启动带有容量预留选项的按需型实例集，请附加使用容量预留选项所需的额外服务角色权限。由于容量预留选项必须与按需分配策略一起使用，因此您还必须在服务角色和托管式策略中提供分配策略所需的权限。有关更多信息，请参阅[分配策略权限使用分配策略所需的 IAM 权限](emr-instance-fleet.md#create-cluster-allocation-policy)。

Amazon EMR 支持开放容量预留和目标容量预留。以下主题显示了可与 `RunJobFlow` 操作或 `create-cluster` 命令结合使用的实例集配置，以还使用按需型容量预留启动实例集。

## 尽力使用开放容量预留
<a name="on-demand-capacity-reservations-best-effort"></a>

如果集群的按需型实例与您账户中可用的开放容量预留属性（实例类型、平台、租赁和可用区）相匹配，则会自动应用容量预留。但是，不能保证使用您的容量预留。为了预置集群，Amazon EMR 评估启动请求中指定的所有实例池，并使用价格最低且具有足够容量的实例池来启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配，它们将保持未使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中的实例池中，首先从价格最低的节点开始，直到预置完所有任务节点。将自动应用与实例池匹配的可用开放容量预留。

以下是尽力使用开放容量预留 Amazon EMR 容量分配逻辑的使用案例。

**示例 1: 启动请求中价格最低的实例池具有可用的开放容量预留**

在这种情况下，Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。将自动使用此实例池中可用的开放容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | 150 | 100 | 100 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | 100 | - | - | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | 50 | 100 | 100 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**示例 2: 启动请求中价格最低的实例池没有可用的开放容量预留**

在这种情况下，Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。但是，您的开放容量预留仍处于未使用状态。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
|  可用的开放容量预留  | - | - | 100 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | - | - | - | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | - | - | 100 | 
| --- |--- |--- |--- |

**配置实例机群以便尽力使用开放容量预留**

您使用 `RunJobFlow` 操作创建基于实例集的集群时，请将按需分配策略设置为 `lowest-price` 和 `CapacityReservationPreference`，以让容量预留选项保持 `open`。或者，如果您将此字段留空，Amazon EMR 会将按需型实例的容量预留首选项默认设置为 `open`。

```
"LaunchSpecifications": 
    {"OnDemandSpecification": {
        "AllocationStrategy": "lowest-price",
        "CapacityReservationOptions":
         {
            "CapacityReservationPreference": "open"
         }
        }
    }
```

此外，您还可以使用 Amazon EMR CLI 创建使用开放容量预留、基于实例集的集群。

```
aws emr create-cluster \
	--name 'open-ODCR-cluster' \
	--release-label emr-5.30.0 \
	--service-role EMR_DefaultRole \
	--ec2-attributes SubnetId=subnet-22XXXX01,InstanceProfile=EMR_EC2_DefaultRole \
	--instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=c4.xlarge}'] \
	  InstanceFleetType=CORE,TargetOnDemandCapacity=100,InstanceTypeConfigs=['{InstanceType=c5.xlarge},{InstanceType=m5.xlarge},{InstanceType=r5.xlarge}'],\
	  LaunchSpecifications={OnDemandSpecification='{AllocationStrategy=lowest-price,CapacityReservationOptions={CapacityReservationPreference=open}}'}
```

其中，
+ `open-ODCR-cluster` 替换为使用开放容量预留的集群的名称。
+ `subnet-22XXXX01` 替换为子网 ID。

## 首先使用开放容量预留
<a name="on-demand-capacity-reservations-first"></a>

在预置 Amazon EMR 集群时，您可以选择覆盖价格最低的分配策略，并将首先使用可用的开放容量预留作为首要优先级。在这种情况下，Amazon EMR 会评估在启动请求中指定容量预留的所有实例池，并使用具有足够容量且价格最低的实例池来启动所有请求的核心节点。如果具有容量预留的实例池没有足够容量用于请求的核心节点，Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说，Amazon EMR 会重新评估启动请求中指定的所有实例池，并使用价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配，它们将保持未使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有容量预留的实例池中，首先从价格最低的实例池开始，直到预置完所有任务节点。Amazon EMR 首先使用选定可用区中每个实例池中可用的开放容量预留，并且仅在需要时使用价格最低的策略来预置所有剩余的任务节点。

以下是首先使用开放容量预留的 Amazon EMR 容量分配逻辑的使用案例。

**示例 1：**启动请求中具有可用开放容量预留的实例池具有足够的核心节点容量****

在这种情况下，Amazon EMR 在具有可用开放容量预留的实例池中启动容量，而不考虑实例池价格。因此，会在预置所有核心节点之前，尽可能使用您的开放容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | - | - | 150 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | - | - | 100 | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | - | - | 100 | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | - | - | 50 | 
| --- |--- |--- |--- |

**示例 2：**启动请求中具有可用开放容量预留的实例池没有足够的容量用于核心节点****

在这种情况下，Amazon EMR 回退到使用价格最低的策略启动核心节点，并尽力使用容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | 10 | 50 | 50 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | 10 | - | - | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | - | 50 | 50 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**将实例机群配置为首先使用开放容量预留**

使用 `RunJobFlow` 操作创建基于势例集的集群时，请将按需分配策略设置为 `lowest-price`，并将 `CapacityReservationOptions` 的 `UsageStrategy` 设置为 `use-capacity-reservations-first`。

```
"LaunchSpecifications": 
    {"OnDemandSpecification": {
        "AllocationStrategy": "lowest-price",
        "CapacityReservationOptions":
         {
            "UsageStrategy": "use-capacity-reservations-first"
         }
       }
    }
```

您还可以使用 Amazon EMR CLI 创建首先使用容量预留的基于实例机群的集群。

```
aws emr create-cluster \
  --name 'use-CR-first-cluster' \
  --release-label emr-5.30.0 \
  --service-role EMR_DefaultRole \
  --ec2-attributes SubnetId=subnet-22XXXX01,InstanceProfile=EMR_EC2_DefaultRole \
  --instance-fleets \
    InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=c4.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=100,InstanceTypeConfigs=['{InstanceType=c5.xlarge},{InstanceType=m5.xlarge},{InstanceType=r5.xlarge}'],\
LaunchSpecifications={OnDemandSpecification='{AllocationStrategy=lowest-price,CapacityReservationOptions={UsageStrategy=use-capacity-reservations-first}}'}
```

其中，
+ `use-CR-first-cluster` 替换为使用开放容量预留的集群的名称。
+ `subnet-22XXXX01` 替换为子网 ID。

## 首先使用目标容量预留
<a name="on-demand-capacity-reservations-targeted"></a>

预置 Amazon EMR 集群时，您可以选择覆盖价格最低的分配策略，并将首先使用可用的目标容量预留作为首要优先级。在这种情况下，Amazon EMR 会评估在启动请求中指定目标预留的所有实例池，并选择具有足够容量的价格最低的实例池来启动所有请求的核心节点。如果具有目标容量预留的实例池没有足够容量用于请求的核心节点，Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说，Amazon EMR 会重新评估启动请求中指定的所有实例池，并选择价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。但是，目标容量预留仍处于使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有目标容量预留的实例池中，首先从价格最低的实例池开始，直到预置完所有任务节点。Amazon EMR 首先尝试使用选定可用区中每个实例池中可用的目标容量预留。然后，Amazon EMR 仅在需要时使用价格最低的策略来预置所有剩余的任务节点。

以下是首先使用目标容量预留的 Amazon EMR 容量分配逻辑的使用案例。

**示例 1: 启动请求中具有可用目标容量预留的实例池具有足够的核心节点容量**

在这种情况下，Amazon EMR 在具有可用目标容量预留的实例池中启动容量，而不考虑实例池价格。因此，会在预置所有核心节点之前，尽可能使用您的目标容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 使用策略 | use-capacity-reservations-first | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的目标容量预留 | - | - | 150 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | - | - | 100 | 
| --- |--- |--- |--- |
| 已使用的目标容量预留 | - | - | 100 | 
| --- |--- |--- |--- |
| 可用的目标容量预留 | - | - | 50 | 
| --- |--- |--- |--- |

**Example 示例 2：启动请求中具有可用目标容量预留的实例池没有足够的容量用于核心节点**  


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的目标容量预留 | 10 | 50 | 50 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的目标容量预留 | 10 | - | - | 
| --- |--- |--- |--- |
| 可用的目标容量预留 | - | 50 | 50 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**将实例机群配置为首先使用目标容量预留**

使用 `RunJobFlow` 操作创建基于实例集的集群时，请将按需分配策略设置为 `lowest-price`，并将 `CapacityReservationOptions` 的 `UsageStrategy` 设置为 `use-capacity-reservations-first`、将 `CapacityReservationOptions` 的 `CapacityReservationResourceGroupArn` 设置为 `<your resource group ARN>`。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[使用容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-using.html)。

```
"LaunchSpecifications": 
    {"OnDemandSpecification": {
        "AllocationStrategy": "lowest-price",
        "CapacityReservationOptions":
         {
            "UsageStrategy": "use-capacity-reservations-first",
            "CapacityReservationResourceGroupArn": "arn:aws:resource-groups:sa-east-1:123456789012:group/MyCRGroup"
         }
       }
    }
```

其中，将 `arn:aws:resource-groups:sa-east-1:123456789012:group/MyCRGroup` 替换为您的资源组 ARN。

您还可以使用 Amazon EMR CLI 创建首先使用目标容量预留的基于实例机群的集群。

```
aws emr create-cluster \
  --name 'targeted-CR-cluster' \
  --release-label emr-5.30.0 \
  --service-role EMR_DefaultRole \
  --ec2-attributes SubnetId=subnet-22XXXX01,InstanceProfile=EMR_EC2_DefaultRole \
  --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=c4.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=100,\
InstanceTypeConfigs=['{InstanceType=c5.xlarge},{InstanceType=m5.xlarge},{InstanceType=r5.xlarge}'],\
LaunchSpecifications={OnDemandSpecification='{AllocationStrategy=lowest-price,CapacityReservationOptions={UsageStrategy=use-capacity-reservations-first,CapacityReservationResourceGroupArn=arn:aws:resource-groups:sa-east-1:123456789012:group/MyCRGroup}}'}
```

其中，
+ 将 `targeted-CR-cluster` 替换为使用目标容量预留的集群的名称。
+ `subnet-22XXXX01` 替换为子网 ID。
+ 将 `arn:aws:resource-groups:sa-east-1:123456789012:group/MyCRGroup` 替换为您的资源组 ARN。

## 避免使用可用的开放容量预留
<a name="on-demand-capacity-reservations-avoiding"></a>

**Example**  
如果您希望避免在启动 Amazon EMR 集群时意外使用任何开放容量预留，请将按需分配策略设置为 `lowest-price`，并将 `CapacityReservationOptions` 的 `CapacityReservationPreference` 设置为 `none`。否则，Amazon EMR 会将按需型实例的容量预留首选项默认设置为 `open`，并尝试尽力使用可用的开放容量预留。  

```
"LaunchSpecifications": 
    {"OnDemandSpecification": {
        "AllocationStrategy": "lowest-price",
        "CapacityReservationOptions":
         {
            "CapacityReservationPreference": "none"
         }
       }
    }
```
您还可以在不使用任何开放容量预留的情况下，使用 Amazon EMR CLI 创建基于实例集的集群。  

```
aws emr create-cluster \
  --name 'none-CR-cluster' \
  --release-label emr-5.30.0 \
  --service-role EMR_DefaultRole \
  --ec2-attributes SubnetId=subnet-22XXXX01,InstanceProfile=EMR_EC2_DefaultRole \
  --instance-fleets \
    InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=c4.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=100,InstanceTypeConfigs=['{InstanceType=c5.xlarge},{InstanceType=m5.xlarge},{InstanceType=r5.xlarge}'],\
LaunchSpecifications={OnDemandSpecification='{AllocationStrategy=lowest-price,CapacityReservationOptions={CapacityReservationPreference=none}}'}
```
其中，  
+ 将 `none-CR-cluster` 替换为不使用任何开放容量预留的集群的名称。
+ `subnet-22XXXX01` 替换为子网 ID。

## 使用容量预留的方案
<a name="on-demand-capacity-reservations-scenarios"></a>

在以下情况下，使用容量预留可以获得益处。

**情况 1：使用容量预留轮替长时间运行的集群**  
在轮替一个长时间运行的集群时，您可能对预置新实例的实例类型和可用区有严格的要求。通过容量预留，您可以使用容量保证来完成集群轮替，且不会发生中断。

![\[使用可用容量预留的集群轮替\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/odcr-longrunning-cluster-diagram.png)


**方案 2：使用容量预留预置连续的短期集群**  
您还可以使用容量预留为单个工作负载配置一组连续的短期集群，以便在终止集群时，下一个集群可以使用容量预留。您可以使用目标容量预留来确保仅预期集群使用容量预留。

![\[使用可用容量预留的短期集群预置\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/odcr-short-cluster-diagram.png)
