配置统一实例组 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

配置统一实例组

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

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

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

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

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

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

注意

我们重新设计了 Amazon EMR 控制台,以便其易于使用。请参阅 控制台中的新增功能,以了解有关新旧控制台体验差异的信息。

New console
使用新控制台通过实例组创建集群
  1. 登录 Amazon Web Services Management Console 并打开 Amazon EMR 控制台,网址为 https://console.aws.amazon.com/emr

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

  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(创建集群)。

Old console

在创建集群时,以下过程涵盖了 Advanced options (高级选项)。此外,借助 Quick options (快速选项),可使用实例组配置创建集群。

使用旧控制台通过统一实例组创建集群
  1. 导航到 Amazon EMR 新控制台,然后从侧面导航栏中选择切换到旧控制台。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

  2. 选择创建集群

  3. 选择 Go to advanced options (转到高级选项),输入 Software Configuration (软件配置) 选项,然后选择 Next (下一步)

  4. Hardware Configuration (硬件配置) 屏幕中,将 Uniform instance groups (统一实例组) 保持选中状态。

  5. 选择 Network (网络),然后选择您的集群的 EC2 Subnet (EC2 子网)。您选择的子网将与可用性组关联,后者与每个子网一起列出。有关更多信息,请参阅配置联网

    注意

    您的账户和区域可能为您提供了为 Network (网络) 选择 Launch into EC2-Classic (在 EC2-Classic 中启动) 的选项。如果您选择该选项,请选择 EC2 Availability Zone (EC2 可用区) 而非 EC2 Subnet (EC2 子网)。有关更多信息,请参阅《适用于 Linux 实例的 Amazon EC2 用户指南》中的 Amazon EC2 和 Amazon VPC

  6. 在每个 Node type (节点类型) 行中:

    • 如果您需要更改实例组的默认名称,请在 Node type (节点类型) 下,选择铅笔图标,然后输入易识别的名称。若要删除 Task (任务) 实例组,请选择 X 图标。选择 Add task instance group (添加任务实例组) 以添加其它 Task (任务) 实例组。

    • Instance type (实例类型) 下面,选择铅笔图标,然后选择要用于该节点类型的实例类型。

      重要

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

    • Instance type(实例类型)下面,选择 Configurations(配置)的铅笔图标,然后编辑每个实例组的应用程序配置。

    • Instance count (实例计数) 下,输入要用于每个节点类型的实例的数量。

    • Purchasing option (购买选项) 下,选择 On-demand (按需)Spot。如果选择 Spot,请为竞价型实例选择最高价的选项。默认情况下,选择 Use on-demand as max price (使用按需价格作为最高价格)。您可以选择 Set max $/hr (设定最高价($/小时)),然后输入您的最高价。您选择的 EC2 Subnet (EC2 子网) 的可用区价格低于 Maximum Spot price (最高 Spot 价格)

      提示

      将鼠标移到 Spot 的信息工具提示上方可查看当前区域中可用区的当前 Spot 价格。最低 Spot 价格用绿色显示。您可能需要使用此信息来更改您的 EC2 Subnet (EC2 子网) 选择。

    • Auto Scaling for Core and Task node types (自动扩展核心和任务节点类型) 下,选择铅笔图标,然后配置自动扩展选项。有关更多信息,请参阅将自动伸缩与实例组的自定义策略结合使用

  7. 根据需要选择 Add task instance group (添加任务实例组) 并按照上一步中所述配置设置。

  8. 选择 Next (下一步),修改其它集群设置,然后启动集群。

使用 Amazon CLI 通过统一实例组创建集群

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

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

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

注意

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

aws emr create-cluster --name "MySpotCluster" \ --release-label emr-5.36.1 \ --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。请注意,自定义 AMI 仅在实例类型级别指定,而不是在集群级别指定。这是为了避免集群级别的实例类型 AMI 和 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

您可以向添加到正在运行的集群的实例组中添加多个自定义 AMI。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");