在 Amazon EMR 中将容量预留与实例集结合使用
要启动带有容量预留选项的按需型实例集,请附加使用容量预留选项所需的额外服务角色权限。由于容量预留选项必须与按需分配策略一起使用,因此您还必须在服务角色和托管式策略中提供分配策略所需的权限。有关更多信息,请参阅分配策略权限。
Amazon EMR 支持开放容量预留和目标容量预留。以下主题显示了可与 RunJobFlow
操作或 create-cluster
命令结合使用的实例集配置,以还使用按需型容量预留启动实例集。
尽力使用开放容量预留
如果集群的按需型实例与您账户中可用的开放容量预留属性(实例类型、平台、租赁和可用区)相匹配,则会自动应用容量预留。但是,不能保证使用您的容量预留。为了预置集群,Amazon EMR 评估启动请求中指定的所有实例池,并使用价格最低且具有足够容量的实例池来启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配,它们将保持未使用状态。
预置核心节点后,就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中的实例池中,首先从价格最低的节点开始,直到预置完所有任务节点。将自动应用与实例池匹配的可用开放容量预留。
以下是尽力使用开放容量预留 Amazon EMR 容量分配逻辑的使用案例。
示例 1: 启动请求中价格最低的实例池具有可用的开放容量预留
在这种情况下,Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。将自动使用此实例池中可用的开放容量预留。
On-Demand Strategy | lowest-price | ||
Requested Capacity | 100 | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
Available Open capacity reservations | 150 | 100 | 100 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | 100 | - | - |
---|---|---|---|
已使用的开放容量预留 | 100 | - | - |
可用的开放容量预留 | 50 | 100 | 100 |
在启动队列后,您可以运行 describe-capacity-reservations
来查看剩余的未使用的容量预留量。
示例 2: 启动请求中价格最低的实例池没有可用的开放容量预留
在这种情况下,Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。但是,您的开放容量预留仍处于未使用状态。
On-Demand Strategy | lowest-price | ||
Requested Capacity | 100 | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
可用的开放容量预留 |
- | - | 100 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | 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。
首先使用开放容量预留
在预置 Amazon EMR 集群时,您可以选择覆盖价格最低的分配策略,并将首先使用可用的开放容量预留作为首要优先级。在这种情况下,Amazon EMR 会评估在启动请求中指定容量预留的所有实例池,并使用具有足够容量且价格最低的实例池来启动所有请求的核心节点。如果具有容量预留的实例池没有足够容量用于请求的核心节点,Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说,Amazon EMR 会重新评估启动请求中指定的所有实例池,并使用价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配,它们将保持未使用状态。
预置核心节点后,就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有容量预留的实例池中,首先从价格最低的实例池开始,直到预置完所有任务节点。Amazon EMR 首先使用选定可用区中每个实例池中可用的开放容量预留,并且仅在需要时使用价格最低的策略来预置所有剩余的任务节点。
以下是首先使用开放容量预留的 Amazon EMR 容量分配逻辑的使用案例。
示例 1:启动请求中具有可用开放容量预留的实例池具有足够的核心节点容量
在这种情况下,Amazon EMR 在具有可用开放容量预留的实例池中启动容量,而不考虑实例池价格。因此,会在预置所有核心节点之前,尽可能使用您的开放容量预留。
On-Demand Strategy | lowest-price | ||
Requested Capacity | 100 | ||
Usage Strategy | use-capacity-reservations-first | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
Available Open capacity reservations | - | - | 150 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | - | - | 100 |
---|---|---|---|
已使用的开放容量预留 | - | - | 100 |
可用的开放容量预留 | - | - | 50 |
示例 2:启动请求中具有可用开放容量预留的实例池没有足够的容量用于核心节点
在这种情况下,Amazon EMR 回退到使用价格最低的策略启动核心节点,并尽力使用容量预留。
On-Demand Strategy | lowest-price | ||
Requested Capacity | 100 | ||
Usage Strategy | use-capacity-reservations-first | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
Available Open capacity reservations | 10 | 50 | 50 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | 100 | - | - |
---|---|---|---|
已使用的开放容量预留 | 10 | - | - |
可用的开放容量预留 | - | 50 | 50 |
在启动队列后,您可以运行 describe-capacity-reservations
来查看剩余的未使用的容量预留量。
将实例机群配置为首先使用开放容量预留
使用 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。
首先使用目标容量预留
预置 Amazon EMR 集群时,您可以选择覆盖价格最低的分配策略,并将首先使用可用的目标容量预留作为首要优先级。在这种情况下,Amazon EMR 会评估在启动请求中指定目标预留的所有实例池,并选择具有足够容量的价格最低的实例池来启动所有请求的核心节点。如果具有目标容量预留的实例池没有足够容量用于请求的核心节点,Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说,Amazon EMR 会重新评估启动请求中指定的所有实例池,并选择价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。但是,目标容量预留仍处于使用状态。
预置核心节点后,就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有目标容量预留的实例池中,首先从价格最低的实例池开始,直到预置完所有任务节点。Amazon EMR 首先尝试使用选定可用区中每个实例池中可用的目标容量预留。然后,Amazon EMR 仅在需要时使用价格最低的策略来预置所有剩余的任务节点。
以下是首先使用目标容量预留的 Amazon EMR 容量分配逻辑的使用案例。
示例 1: 启动请求中具有可用目标容量预留的实例池具有足够的核心节点容量
在这种情况下,Amazon EMR 在具有可用目标容量预留的实例池中启动容量,而不考虑实例池价格。因此,会在预置所有核心节点之前,尽可能使用您的目标容量预留。
On-Demand Strategy | lowest-price | ||
Usage Strategy | use-capacity-reservations-first | ||
Requested Capacity | 100 | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
Available targeted capacity reservations | - | - | 150 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | - | - | 100 |
---|---|---|---|
已使用的目标容量预留 | - | - | 100 |
可用的目标容量预留 | - | - | 50 |
例 示例 2:启动请求中具有可用目标容量预留的实例池没有足够的容量用于核心节点
On-Demand Strategy | lowest-price | ||
Requested Capacity | 100 | ||
Usage Strategy | use-capacity-reservations-first | ||
Instance Type | c5.xlarge | m5.xlarge | r5.xlarge |
Available targeted capacity reservations | 10 | 50 | 50 |
On-Demand Price | $ | $$ | $$$ |
预置的实例 | 100 | - | - |
---|---|---|---|
已使用的目标容量预留 | 10 | - | - |
可用的目标容量预留 | - | 50 | 50 |
在启动队列后,您可以运行 describe-capacity-reservations
来查看剩余的未使用的容量预留量。
将实例机群配置为首先使用目标容量预留
使用 RunJobFlow
操作创建基于实例集的集群时,请将按需分配策略设置为 lowest-price
,并将 CapacityReservationOptions
的 UsageStrategy
设置为 use-capacity-reservations-first
、将 CapacityReservationOptions
的 CapacityReservationResourceGroupArn
设置为 <your resource group
ARN>
。有关更多信息,请参阅《Amazon EC2 用户指南》中的使用容量预留。
"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。
避免使用可用的开放容量预留
如果您希望避免在启动 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。
使用容量预留的方案
在以下情况下,使用容量预留可以获得益处。
情况 1:使用容量预留轮替长时间运行的集群
在轮替一个长时间运行的集群时,您可能对预置新实例的实例类型和可用区有严格的要求。通过容量预留,您可以使用容量保证来完成集群轮替,且不会发生中断。
方案 2:使用容量预留预置连续的短期集群
您还可以使用容量预留为单个工作负载配置一组连续的短期集群,以便在终止集群时,下一个集群可以使用容量预留。您可以使用目标容量预留来确保仅预期集群使用容量预留。