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

配置实例队列

集群的实例队列配置提供了各种面向 EC2 实例的预配置选项。对于实例队列,您可以为每个队列内的按需实例和 Spot 实例指定目标容量。当集群启动时,Amazon EMR 会预配置实例,直至达到目标。您可以为每个队列指定最多 5 个 EC2 实例类型以便 Amazon EMR 在实现目标时使用。您也可以为不同的可用区选择多个子网。当 Amazon EMR 启动集群时,它会在这些子网中查找您指定的实例和购买选项。

当集群运行时,如果 Amazon EC2 因价格上涨而回收 Spot 实例或实例失败,Amazon EMR 会尝试将该实例替换为您指定的任何实例类型。这使得可在 Spot 价格高峰期间更轻松地重新获取容量。实例队列可让您为每个节点类型制定灵活的弹性资源配置策略。例如,在特定的队列中,您可以用便宜的 Spot 容量(如果可用)来补充按需容量核心,然后在无法按您的价格提供 Spot 时切换到按需容量。

注意

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

关键功能摘要

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

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

  • 对于核心队列和任务队列,设定 Spot 和按需实例的目标容量。请使用分配给计入目标的每个 EC2 实例的 vCPU 或通用单位。Amazon EMR 预配置实例,直至达到每个目标容量。对于主队列,目标始终是一。

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

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

    • 对于每个实例类型,指定最高 Spot 价格。如果 Spot 价格低于最高 Spot 价格,Amazon EMR 会预配置 Spot 实例。您按 Spot 价格付费,但这不一定是最高 Spot 价格。

    • (可选)为每个队列指定定义的持续时间(也称作“Spot 限制”)。Spot 实例仅在定义的持续时间过期后终止。

    • 对于每个队列,定义预配置 Spot 实例的超时期限。如果 Amazon EMR 无法预配置 Spot 容量,您可以改为终止集群或切换到预配置按需容量。

实例队列选项

使用以下准则来了解实例队列选项。

设置目标容量

为核心队列和任务队列指定所需的目标容量。此操作将确定 Amazon EMR 预配置的按需实例和 Spot 实例的数量。在指定实例时,您将决定每个实例计入目标的量。在预配置按需实例时,该容量将计入按需目标。Spot 实例也是如此。与核心和任务队列不同,主队列始终为一个实例。因此,此队列的目标容量始终是一。

在使用控制台时,默认情况下,EC2 实例类型的 vCPU 数量将用于目标容量的计数。您可以将此项更改为 Generic units (通用单位),然后为每个 EC2 实例类型指定计数。在使用 AWS CLI 时,您将为每个实例类型手动分配通用单位。

重要

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

对于每个队列,可指定最多 5 个 EC2 实例类型。Amazon EMR 选择这些 EC2 实例类型的任意组合来达到您的目标容量。由于 Amazon EMR 希望完全填满目标容量,因此可能会超过目标。例如,如果存在 2 个未填满的单位,并且 Amazon EMR 只能使用 5 个单位来预配置实例,则仍将预配置该实例,这意味着将超出目标容量 3 个单位。

如果减少目标容量以调整正在运行的集群的大小,Amazon EMR 会尝试完成应用程序任务并终止实例以满足新目标。有关更多信息,请参阅 在任务完成时终止。Amazon EMR 为完成大小调整操作设定了 60 分钟的超时时间。在某些情况下,节点可能在 60 分钟后仍运行任务,并且 Amazon EMR 会报告大小调整操作已成功但未满足新目标。

Spot 实例选项

您为队列中的所有 5 种实例类型均指定 Maximum Spot price (最高 Spot 价格)。您可以采用按需价格的百分比形式或特定美元金额形式设置此价格。如果可用区中的当前 Spot 价格低于您的最高 Spot 价格,Amazon EMR 会预配置 Spot 实例。您按 Spot 价格付费,但这不一定是最高 Spot 价格。

您可以为队列中的 Spot 实例指定 Defined duration (定义的持续时间)。当 Spot 价格发生更改时,Amazon EMR 不会终止实例,直到 Defined duration (定义的持续时间) 过期。在选择此选项时,定义的持续时间定价将适用。如果未指定定义的持续时间,则一旦 Spot 价格高于最高 Spot 价格,实例就会终止。有关定义的持续时间定价的更多信息,请参阅指定 Spot 实例的持续时间Amazon EC2 Spot 实例定价

对于每个队列,您还可定义 Provisioning timeout (预配置超时)。创建集群后,如果集群正在预配置容量,但无法预配置足够的 Spot 实例来达到您指定的目标容量,则超时将适用。您可以指定超时期限和要执行的操作。您可以让集群终止或切换到预配置的按需容量,以便满足剩余 Spot 容量。当您选择切换到按需时,剩余 Spot 容量将在超时到期后有效地添加到按需目标容量。

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

多个子网 (可用区) 选项

在使用实例队列时,您可以在 VPC 中指定多个 EC2 子网,每个子网均对应一个不同的可用区。如果您使用 EC2-Classic,则需明确指定可用区。Amazon EMR 将根据您的队列规范确定最佳可用区以启动实例。始终仅在一个可用区中预配置实例。您可以选择私有子网或公有子网,但不能将二者混合,并且指定的子网必须位于同一 VPC 中。

主节点配置

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

使用控制台配置实例队列

要通过实例队列创建集群,请在 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 选项。您可以输入您的最高 Spot 价格作为 % of On-Demand 定价,也可以输入 Dollars ($) 金额 (以 USD 为单位)。

      提示

      将鼠标指针悬停在 Maximum Spot price 的信息工具提示的上方可查看当前区域中所有可用区的 Spot 价格。最低 Spot 价格用绿色显示。您可以使用此信息来告知您的 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 实例就会终止。如果您设置一个值,则在持续时间过期前, 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}']

例 示例:Spot 主实例、带单个实例类型的 Spot 核心实例、默认 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 核心实例、 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 指定主、核心和任务实例队列,如以下示例所示。核心实例队列使用以按需价格的百分比表示的最高 Spot 价格 (BidPrice),而任务和主实例队列使用以 USD 表示的最高 Spot 价格 (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}']