Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

配置实例队列

集群的实例队列配置提供了各种面向 EC2 实例的预配置选项。您可以为每个队列指定最多 5 个实例类型,并且可使用按需和竞价型购买选项预配置这些实例类型。您也可以选择多个可用区,为每个实例指定不同的最高 Spot 价格并为每个实例队列选择其他 Spot 选项。在集群启动时,Amazon EMR 使用您指定的选项更智能且更快地预配置容量。另外,当群集运行时,如果 Amazon EC2 因价格上涨而回收 Spot 实例或实例失败,Amazon EMR 会尝试将实例替换为您指定的任何实例类型。这使得可在现货价峰值期间更轻松地重新获取集群容量。您可以为每个节点类型制定灵活的弹性资源配置策略。例如,在特定的队列中,您可以用便宜的竞价型容量 (如果可用) 补充按需容量核心。

注意

实例队列配置仅在 Amazon EMR 版本 4.8.0 和更高版本中可用 (不包括 5.0.0 和 5.0.3)。

实例队列选项

目标容量和权重容量

对于每个实例队列,您可以为按需实例设立一个目标容量,并为 Spot 实例设立一个目标容量。对每个实例队列可用的 5 个实例类型均具有一个您分配的权重容量。在使用控制台时,您可以选择让实例类型的 vCPU 自动分配为权重容量。在使用 CLI 时,您手动分配权重容量。

重要

使用 AWS Management Console选择实例类型时,每个 Instance type 显示的 vCPU 数量是该实例类型的 YARN vcore 数量,而不是该实例类型的 EC2 vCPU 数量。有关每个实例类型的 vCPU 数量的更多信息,请参阅 Amazon EC2 实例类型

在 Amazon EMR 预配置特定的实例类型时,它可以选择您指定的 5 个实例类型的任意组合来实现这些目标,并且每个预配置实例的权重容量将为按需或竞价型 (根据情况) 目标容量计数。

Amazon EMR 预配置队列中的实例,直至达到目标容量,即使这会导致超容量也是如此。例如,如果还差 2 个单位即可达到容量,而 Amazon EMR 只能使用 5 个单位的权重容量来预配置实例,则仍将预配置实例,但将超出目标容量 3 个单位。

Spot 实例选项

在指定 Spot 实例的目标容量时,您可为所有 5 个实例类型指定最高 Spot 价格。Amazon EMR 会将最高 Spot 价格与您选定的可用区中提供的 Spot 价格进行比较,并在当前 Spot 价格低于您指定的最高 Spot 价格的情况下预配置 Spot 实例。

对于整个队列,当您指定定义的持续时间时, Spot 实例不会在定义的持续时间内中断,也不会在定义的持续时间过期后终止。在选择此选项时,定义的持续时间定价将适用。有关更多信息,请参阅 Amazon EC2 Spot 实例定价。如果未指定定义的持续时间,则一旦现货价格高于最高现货价格,实例就会终止。

对于整个队列,您还定义了预配置超时以及在超时过期时未达到 Spot 实例的目标容量的情况下要执行的操作。在创建集群时,如果集群是预配置容量,则超时将适用。您可以让集群终止或切换到预配置的按需容量,以便满足剩余竞价型容量。

有关 Spot 实例的更多信息,请参阅 Amazon EC2 User Guide for Linux Instances 中的 Spot 实例

多个子网 (可用区) 选项

您可以在 VPC 中指定多个 EC2 子网,每个子网均对应一个不同的可用区。(如果您使用 EC2-Classic,则可明确指定可用区。)Amazon EMR 从这些可用区中寻找最适合的可用区,然后在该可用区中预配置实例。始终仅在一个可用区中预配置实例。您可以选择私有子网或公有子网,但不能将二者混合,并且指定的子网必须位于同一 VPC 中。

主节点配置

由于主实例队列只是一个实例,因此其配置与核心和任务实例队列的配置略有不同。由于主实例队列仅包含一个实例,因此您仅为主实例队列选择按需或竞价型。如果您使用控制台创建实例队列,则您选定的购买选项的目标容量将设置为 1。如果您使用 AWS CLI,请始终根据需要将 TargetSpotCapacityTargetOnDemandCapacity 设置为 1。您仍可以为主实例队列选择最多 5 个实例类型。但与核心和任务实例队列 (其中 Amazon EMR 可能预配置多个不同类型的实例) 不同,Amazon EMR 为主实例队列选择要预配置的单个实例类型。

关键功能摘要

  • 每个节点类型 (主节点、核心节点和任务节点) 有且仅有一个实例队列。为每个队列指定了最多 5 个 EC2 实例类型。

  • Amazon EMR 选择所有 5 个 EC2 实例类型或其中的任一 EC2 实例类型来使用竞价型和按需购买选项进行预配置。

  • 设定每个实例队列的 Spot 和按需实例的目标容量。为每个实例类型分配一个权重容量,该容量将根据目标进行计数。Amazon EMR 预配置实例,直至达到每个目标容量。

  • 选择一个子网 (可用区) 或范围。Amazon EMR 预配置最适合的可用区中的容量。

  • 在指定 Spot 实例的目标容量时:

    • 对于每个实例类型,指定最高现货价格 (以美元金额形式或以按需价格的百分比形式)。

    • 如果需要,指定定义的持续时间 (也称作 Spot 限制)。 Spot 实例仅在定义的持续时间过期后终止。

    • 定义预配置 Spot 实例的超时期限以及在超时过期的情况下要执行的操作 - 终止群集或切换到按需。

使用控制台配置实例队列

要通过实例队列创建集群,请在 Amazon EMR 控制台中使用 Advanced options 配置。

使用控制台通过实例队列创建集群

  1. Open the Amazon EMR console at https://console.amazonaws.cn/elasticmapreduce/.

  2. 选择 Create cluster

  3. 选择 Go to advanced options,输入 Software Configuration 选项,然后选择 Next

  4. 选择 Instance fleets

  5. 对于 Network,输入一个值。如果您为 Network 选择 VPC,请选择单个 EC2 子网或按住 Ctrl 并单击以选择多个 EC2 子网。您选择的子网必须属于同一类型 (公有或私有)。如果您仅选择了一个子网,则您的集群将在该子网中启动。如果您选择了一组,则当集群启动时,会从该组中选择具有最佳拟合度的子网。

    注意

    您的账户和区域可能为您提供为 Network 选择 Launch into EC2-Classic 的选项。如果您选择该选项,请从 EC2 Availability Zones 而非 EC2 Subnets 中选择一个或多个项。有关更多信息,请参阅 Amazon EC2 User Guide for Linux Instances 中的 Amazon EC2 和 Amazon VPC

  6. 如果您需要更改实例队列的默认名称,可在每个节点类型行中的 Node type 下,单击铅笔图标,然后输入易识别的名称。若要删除 Task 实例队列,请单击 X 图标。

  7. Target capacity 下,根据以下准则选择选项:

    • 选择您希望如何定义 Target capacity。如果您选择 vCPU,则每个 Fleet instance type 的 YARN vcore 数量将用作其权重容量。如果您选择 Generic units,则为每个目标容量分配一个自定义数字,然后为每个实例类型分配一个自定义权重容量。对于您添加的每个实例,将在 Fleet instance type 下方显示一个用于此用途的字段。

    • 对于 Master 节点,选择实例是 On-demand 还是 Spot

    • 对于 CoreTask 节点,为 On-demandSpot 输入目标容量。Amazon EMR 预配置您指定的队列实例类型,直至达到这些容量。

  8. 在每个 Node typeFleet instance types 下方,根据以下准则选择选项:

    • 选择 Add/remove instance types to fleet,然后从该列表中选择最多 5 个实例类型。Amazon EMR 可在启动集群时预配置这些实例类型的任意组合。

    • 如果使用 SpotTarget capacity 配置节点类型,请选择 Maximum Spot price 选项。您可以输入您的最高现货价格作为 % of On-Demand 定价,也可以输入 Dollars ($) 金额 (以 USD 为单位)。

      提示

      将鼠标指针悬停在 Maximum Spot price 的信息工具提示的上方可查看当前区域中所有可用区的现货价格。最低现货价格用绿色显示。您可以使用此信息来告知您的 EC2 Subnet 选择。

    • 如果您已为 Target capacity 选择 Default units,可在 Each instance counts as 框中输入要分配给每个实例类型的权重容量。

    • 要在预配置实例类型时使 EBS 卷附加到该类型,请单击 EBS Storage 旁边的铅笔图标,然后输入 EBS 配置选项。

  9. 如果您为 Spot 设立了 Target capacity,请根据以下准则选择 Advanced Spot options

    • Defined duration - 如果保留默认值 Not set,则一旦现货价格上涨超过最高 Spot 价格或集群终止,Spot 实例就会终止。如果您设置一个值,则在持续时间过期前, Spot 实例不会终止。

      重要

      如果您设置一个 Defined duration,则特定的定义的持续时间定价将适用。有关定价详细信息,请参阅 Amazon EC2 Spot 实例定价

    • Provisioning timeout - 使用这些设置可控制 Amazon EMR 在无法从您指定的 Fleet instance types 中预配置 Spot 实例时执行的操作。您输入一个超时期限 (以分钟为单位),然后选择 Terminate the cluster 还是 Switch to provisioning On-Demand Instances。如果您选择切换到按需实例,则按需实例的权重容量将根据 Spot 实例的目标容量进行计数,并且 Amazon EMR 将预配置按需实例,直至达到 Spot 实例的目标容量。

  10. 选择 Next,修改其他集群设置,然后启动集群。

使用 CLI 配置实例队列

  • 要使用实例队列创建和启动集群,请将 create-cluster 命令与 --instance-fleet 参数结合使用。

  • 要获取集群中的实例队列的配置详细信息,请使用 list-instance-fleets 命令。

  • 要更改实例队列的目标容量,请使用 modify-instance-fleet 命令。

  • 要向不具有任务实例队列的集群添加此队列,请使用 add-instance-fleet 命令。

注意

包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

使用实例队列配置创建集群

以下示例演示了 create-cluster 命令以及可组合使用的各种选项。

注意

如果您之前未创建默认 EMR 服务角色和 EC2 实例配置文件,请先使用 aws emr create-default-roles 创建它们,然后再使用 create-cluster 命令。

例 示例:按需主实例、带单个实例类型的按需核心实例、默认 VPC

aws emr create-cluster --release-label emr-5.3.1 --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \ --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large}'] \ InstanceFleetType=CORE,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large}']

例 示例:竞价型主实例、带单个实例类型的竞价型核心实例、默认 VPC

aws emr create-cluster --release-label emr-5.3.1 --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \ --instance-fleets InstanceFleetType=MASTER,TargetSpotCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5}'] \ InstanceFleetType=CORE,TargetSpotCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5}']

例 示例:按需主实例、带单个实例类型的混合核心实例、单个 EC2 子网

aws emr create-cluster --release-label emr-5.3.1 --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetIds=['subnet-ab12345c'] \ --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large}'] \ InstanceFleetType=CORE,TargetOnDemandCapacity=2,TargetSpotCapacity=6,InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5,WeightedCapacity=2}']

例 示例:按需主实例、带多个权重实例类型的竞价型核心实例、 Spot 实例的定义的持续时间和超时、EC2 子网的范围

aws emr create-cluster --release-label emr-5.3.1 --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetIds=['subnet-ab12345c','subnet-de67890f'] \ --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large}'] \ InstanceFleetType=CORE,TargetSpotCapacity=11,InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5,WeightedCapacity=3}',\ '{InstanceType=m4.2xlarge,BidPrice=0.9,WeightedCapacity=5}'],\ LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=120,TimeoutAction=SWITCH_TO_ON_DEMAND}'}

例 示例:按需主实例、带多个权重实例类型的混合核心和任务实例、核心 Spot 实例的定义的持续时间和超时、EC2 子网的范围

aws emr create-cluster --release-label emr-5.3.1 --service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,SubnetIds=['subnet-ab12345c','subnet-de67890f'] \ --instance-fleets InstanceFleetType=MASTER,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m4.large}'] \ InstanceFleetType=CORE,TargetOnDemandCapacity=8,TargetSpotCapacity=6,\ InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5,WeightedCapacity=3}',\ '{InstanceType=m4.2xlarge,BidPrice=0.9,WeightedCapacity=5}'],\ LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=120,TimeoutAction=SWITCH_TO_ON_DEMAND}'} \ InstanceFleetType=TASK,TargetOnDemandCapacity=3,TargetSpotCapacity=3,\ InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5,WeightedCapacity=3}']

例 示例: Spot 主实例、无核心或任务实例、EBS 配置、默认 VPC

aws emr create-cluster --release-label emr 5.3.1 -service-role EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \ --instance-fleets InstanceFleetType=MASTER,TargetSpotCapacity=1,\ LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=60,TimeoutAction=TERMINATE_CLUSTER}'},\ InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5,\ EbsConfiguration={EbsOptimized=true,EbsBlockDeviceConfigs=[{VolumeSpecification={VolumeType=gp2,\ SizeIn GB=100}},{VolumeSpecification={VolumeType=io1,SizeInGB=100,Iop s=100},VolumesPerInstance=4}]}}']

例 使用 JSON 配置文件

您可以在 JSON 文件中配置实例队列参数,然后将 JSON 文件引用为实例队列的唯一参数。例如,以下命令引用 JSON 配置文件 my-fleet-config.json:

aws emr create-cluster --release-label emr-5.2.0 --servicerole EMR_DefaultRole \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \ --instance-fleets file://my-fleet-config.json

my-fleet-config.json 指定主、核心和任务实例队列,如以下示例所示。核心实例队列使用以按需价格的百分比表示的最高现货价格 (BidPrice),而任务和主实例队列使用以 USD 表示的最高现货价格 (BidPriceAsPercentageofOnDemandPrice) (字符串形式)。

[ { "Name": "Masterfleet", "InstanceFleetType": "MASTER", "TargetSpotCapacity": 1, "LaunchSpecifications": { "SpotSpecification": { "TimeoutDurationMinutes": 120, "TimeoutAction": "SWITCH_TO_ON_DEMAND" } }, "InstanceTypeConfigs": [ { "InstanceType": "m4.large", "BidPrice": "0.89" } ] }, { "Name": "Corefleet", "InstanceFleetType": "CORE", "TargetSpotCapacity": 1, "LaunchSpecifications": { "SpotSpecification": { "TimeoutDurationMinutes": 120, "TimeoutAction": "TERMINATE_CLUSTER" } }, "InstanceTypeConfigs": [ { "InstanceType": "m4.large", "BidPriceAsPercentageOfOnDemandPrice": 100 } ] }, { "Name": "Taskfleet", "InstanceFleetType": "TASK", "TargetSpotCapacity": 1, "LaunchSpecifications": { "SpotSpecification": { "TimeoutDurationMinutes": 120, "TimeoutAction": "TERMINATE_CLUSTER" } }, "InstanceTypeConfigs": [ { "InstanceType": "m4.large", "BidPrice": "0.89" } ] } ]

获取集群中的实例队列的配置详细信息

使用 list-instance-fleets 命令可获取集群中的实例队列的配置详细信息。该命令将集群 ID 用作输入。以下示例演示针对包含主任务实例组和核心任务实例组的集群的该命令及其输出。有关完整响应语法,请参阅 Amazon EMR API Reference 中的 ListInstanceFleets

list-instance-fleets --cluster-id 'j-12ABCDEFGHI34JK'
{ "InstanceFleets": [ { "Status": { "Timeline": { "ReadyDateTime": 1488759094.637, "CreationDateTime": 1488758719.817 }, "State": "RUNNING", "StateChangeReason": { "Message": "" } }, "ProvisionedSpotCapacity": 6, "Name": "CORE", "InstanceFleetType": "CORE", "LaunchSpecifications": { "SpotSpecification": { "TimeoutDurationMinutes": 60, "TimeoutAction": "TERMINATE_CLUSTER" } }, "ProvisionedOnDemandCapacity": 2, "InstanceTypeSpecifications": [ { "BidPrice": "0.5", "InstanceType": "m4.large", "WeightedCapacity": 2 } ], "Id": "if-1ABC2DEFGHIJ3" }, { "Status": { "Timeline": { "ReadyDateTime": 1488759058.598, "CreationDateTime": 1488758719.811 }, "State": "RUNNING", "StateChangeReason": { "Message": "" } }, "ProvisionedSpotCapacity": 0, "Name": "MASTER", "InstanceFleetType": "MASTER", "ProvisionedOnDemandCapacity": 1, "InstanceTypeSpecifications": [ { "BidPriceAsPercentageOfOnDemandPrice": 100.0, "InstanceType": "m4.large", "WeightedCapacity": 1 } ], "Id": "if-2ABC4DEFGHIJ4" } ] }

修改实例队列的目标容量

使用 modify-instance-fleet 命令可指定实例队列的新目标容量。您必须指定集群 ID 和实例队列 ID。使用 list-instance-fleets 命令可检索实例队列 ID。

aws emr modify-instance-fleet --cluster-id 'j-12ABCDEFGHI34JK' / --instance-fleet InstanceFleetId='if-2ABC4DEFGHIJ4',TargetOnDemandCapacity=1,TargetSpotCapacity=1

将任务实例队列添加到集群

如果集群仅具有主和核心实例队列,您可以使用 add-instance-fleet 命令添加任务实例队列。您只能使用此命令添加任务实例队列。

aws emr add-instance-fleet --cluster-id 'j-12ABCDEFGHI34JK' --instance-fleet InstanceFleetType=TASK,TargetSpotCapacity=1,/ LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=20,TimeoutAction=TERMINATE_CLUSTER}'},/ InstanceTypeConfigs=['{InstanceType=m4.large,BidPrice=0.5}']