为 Amazon EMR 集群配置统一实例组 - Amazon EMR

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

为 Amazon EMR 集群配置统一实例组

对于实例组配置,每个节点类型(主节点、核心节点或任务节点)均包含相同的实例类型和相同的实例购买选项:按需或 Spot。在创建实例组时,您可以指定这些设置。它们在以后均不可更改。但您可以将类型和购买选项相同的实例添加到核心和任务实例组。您也可以删除实例。

如果集群的按需型实例与您账户中可用的开放容量预留属性(实例类型、平台、租赁和可用区)相匹配,则会自动应用容量预留。您可以对主节点、核心节点和任务节点使用开放容量预留。但是,使用实例组预置集群时,不能使用目标容量预留,也不能阻止在具有匹配属性的开放容量预留中启动实例。如果要使用目标容量预留或阻止在开放容量预留中启动实例,请改用实例集。有关更多信息,请参阅在 Amazon EMR 中将容量预留与实例集结合使用

要在创建集群后添加不同的实例类型,您可以添加其它任务实例组。您可以为每个实例组选择不同的实例类型和购买选项。有关更多信息,请参阅使用 Amazon EMR 集群扩展来适应不断变化的工作负载

启动实例时,按需实例的容量预留首选项默认设置为 open,这样按需实例才能在任何具有匹配属性(实例类型、平台、可用区)的开放容量预留中运行。有关按需容量预留的更多信息,请参阅在 Amazon EMR 中将容量预留与实例集结合使用

此部分介绍如何使用统一实例组创建集群。有关通过手动添加或删除实例或使用自动扩展来修改现有实例组的更多信息,请参阅管理 Amazon EMR 集群

使用控制台配置统一实例组

Console
使用新控制台通过实例组创建集群
  1. 登录 AWS Management Console,然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com

  2. EC2在左侧导航窗格的 EMR on 下,选择集群,然后选择创建集群。

  3. Cluster configuration(集群配置)下,选择 Instance groups(实例组)。

  4. Node groups(节点组)下,每种类型的节点组都有一个部分。对于主节点组,如果需要 3 个主节点,请选中 Use multiple primary nodes(使用多个主节点)复选框。如果要使用 Spot 购买,请选中 Use Spot purchasing option(使用 Spot 购买选项)复选框。

  5. 对于主节点组和核心节点组,选择 Add instance type(添加实例类型)并选择最多 5 个实例类型。对于任务组,选择 Add instance type(添加实例类型)并选择最多 15 个实例类型。Amazon EMR 可在启动集群时预置这些实例类型的任意组合。

  6. 在每个节点组类型下,选择每个实例旁边的 Actions(操作)下拉菜单以更改以下设置:

    添加 EBS 卷

    在 Amazon EMR 预置实例类型后,指定要附加到实例类型的 EBS 卷。

    编辑最高 Spot 价格

    为实例集中的每个实例类型指定最高 Spot 价格。您可以采用按需价格的百分比形式或特定美元金额形式设置此价格。如果可用区中的当前 Spot 价格低于最高 Spot 价格,Amazon EMR 会预置竞价型实例。您按 Spot 价格付费,但这不一定是最高 Spot 价格。

  7. 或者,扩展节点配置以输入 JSON 配置或从 Amazon S3 加载 JSON。

  8. 选择适用于集群的任何其他选项。

  9. 要启动集群,选择 Create cluster(创建集群)。

使用创建具有统一实例组的集群 AWS CLI

要使用 AWS CLI指定集群的实例组配置,请将 create-cluster 命令与 --instance-groups 参数结合使用。除非您为实例组指定 BidPrice 实参,否则 Amazon EMR 将使用按需型实例选项。有关使用按需实例和各种集群选项启动统一实例组的 create-cluster 命令的示例,请在命令行上键入 aws emr create-cluster help ,或参阅《AWS CLI 命令参考》中的 create-cluster

您可以使用在 AWS CLI 使用竞价型实例的集群中创建统一的实例组。提供的 Spot 价格取决于可用区。使用 CLI 或 API 时,您可以使用AvailabilityZone参数(如果您使用的是 EC2-classic 网络)或参数的SubnetID --ec2-attributes 参数来指定可用区。您选择的可用区或子网适用于集群,因此可用于所有实例组。如果您未明确指定可用区或子网,Amazon EMR 将在启动集群时选择具有最低 Spot 价格的可用区。

以下示例演示了 create-cluster 命令,该命令创建主实例组、核心实例组和两个任务实例组,这些实例组均使用竞价型实例。myKey替换为您的 Amazon EC2 密钥对的名称。

注意

为了便于读取,包含 Linux 行继续符(\)。它们可以通过 Linux 命令删除或使用。对于 Windows,请将它们删除或替换为脱字符 (^)。

aws emr create-cluster --name "MySpotCluster" \ --release-label emr-7.7.0 \ --use-default-roles \ --ec2-attributes KeyName=myKey \ --instance-groups \ InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1,BidPrice=0.25 \ InstanceGroupType=CORE,InstanceType=m5.xlarge,InstanceCount=2,BidPrice=0.03 \ InstanceGroupType=TASK,InstanceType=m5.xlarge,InstanceCount=4,BidPrice=0.03 \ InstanceGroupType=TASK,InstanceType=m5.xlarge,InstanceCount=2,BidPrice=0.04

通过 CLI,您可以创建统一的实例组集群,为实例组的每种实例类型指定唯一的自定义 AMI。这允许您在同一实例组中使用不同的实例架构。每种实例类型都必须使用具有匹配架构的自定义 AMI。例如,您可以使用 x86_64 架构自定义 AMI 配置 m5.xlarge 实例类型和带有相应的AWS AARCH64 (ARM) 架构自定义 AMI 的 m6g.xlarge 实例类型。

以下示例显示了使用两种实例类型创建的统一实例组集群,每种实例类型都有自定义 AMI。请注意,自定义AMIs 仅在实例类型级别指定,而不是在集群级别指定。这是为了避免实例类型 AMIs 与集群级别的 AMI 发生冲突,这会导致集群启动失败。

aws emr create-cluster --release-label emr-5.30.0 \ --service-role EMR_DefaultRole \ --ec2-attributes SubnetId=subnet-22XXXX01,InstanceProfile=EMR_EC2_DefaultRole \ --instance-groups \ InstanceGroupType=MASTER,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-123456 \ InstanceGroupType=CORE,InstanceType=m6g.xlarge,InstanceCount=1,CustomAmiId=ami-234567

您可以将多个自定义 AMIs 添加到正在运行的集群的实例组中。CustomAmiId参数可以与add-instance-groups命令一起使用,如以下示例所示。

aws emr add-instance-groups --cluster-id j-123456 \ --instance-groups \ InstanceGroupType=Task,InstanceType=m5.xlarge,InstanceCount=1,CustomAmiId=ami-123456

使用 Java SDK 创建实例组

您实例化一个 InstanceGroupConfig 对象,此对象指定集群的实例组配置。要使用竞价型实例,您可以在 withBidPrice 对象上设置 withMarketInstanceGroupConfig 属性。以下代码演示了如何定义运行竞价型实例的主实例组、核心实例组和任务实例组。

InstanceGroupConfig instanceGroupConfigMaster = new InstanceGroupConfig() .withInstanceCount(1) .withInstanceRole("MASTER") .withInstanceType("m4.large") .withMarket("SPOT") .withBidPrice("0.25"); InstanceGroupConfig instanceGroupConfigCore = new InstanceGroupConfig() .withInstanceCount(4) .withInstanceRole("CORE") .withInstanceType("m4.large") .withMarket("SPOT") .withBidPrice("0.03"); InstanceGroupConfig instanceGroupConfigTask = new InstanceGroupConfig() .withInstanceCount(2) .withInstanceRole("TASK") .withInstanceType("m4.large") .withMarket("SPOT") .withBidPrice("0.10");