

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

# 配置 Amazon EC2 实例类型以用于 Amazon EMR
<a name="emr-plan-ec2-instances"></a>

EC2 实例附带了不同的配置，称作*实例类型*。实例类型均有不同的 CPU、输入/输出和存储容量。除了实例类型之外，您还可以为 Amazon EC2 实例选择不同的购买选项。您可以在统一实例组或实例集中指定不同的实例类型和购买选项。有关更多信息，请参阅[使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)。有关为应用程序选择实例类型和购买选项的指导，请参阅 [为竞价型实例配置 Amazon EMR 集群实例类型和最佳实践](emr-plan-instances-guidelines.md)。

**重要**  
当您使用选择实例类型时 AWS 管理控制台，显示的每种实例类型**的 vCPU** 数量是该**实例类型**的 YARN vcore 数，而不是该实例类型的 EC2 v CPUs 数。有关每种实例类型的 v CPUs 数的更多信息，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。

**Topics**
+ [Amazon EMR 支持的实例类型](emr-supported-instance-types.md)
+ [在 VPC 中为 Amazon EMR 配置联网](emr-plan-vpc-subnet.md)
+ [使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)

# Amazon EMR 支持的实例类型
<a name="emr-supported-instance-types"></a>

本节介绍 Amazon EMR 支持的实例类型（按 AWS 区域整理）。要了解有关实例类型的更多信息，请参阅 [Amazon EC2 实例](https://aws.amazon.com/ec2/instance-types/)和 [Amazon Linux AMI 实例类型矩阵](https://aws.amazon.com/amazon-linux-ami/instance-type-matrix/)。

并非所有实例类型在所有区域内都可用，实例可用性取决于指定区域和可用区的可用性和需求。实例的可用区由您用于启动集群的子网决定。

## 注意事项
<a name="emr-supported-instance-types-considerations"></a>

为 Amazon EMR 集群选择实例类型时，请考虑以下事项。

**重要**  
当您使用选择实例类型时 AWS 管理控制台，显示的每种实例类型**的 vCPU** 数量是该**实例类型**的 YARN vcore 数，而不是该实例类型的 EC2 v CPUs 数。有关每种实例类型的 v CPUs 数的更多信息，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。
+ 如果您使用在指定区域和可用区中不可用的实例类型创建集群，则您的集群可能无法预置或可能预置失败。有关实例可用性的信息，请参阅 [Amazon EMR 定价页面](https://aws.amazon.com/emr/pricing)或者查看此页面上的 [支持的实例类型由 AWS 区域](#emr-instance-types-by-region) 表格。
+ 从 Amazon EMR 5.13.0 版本开始，所有实例均为根卷使用 HVM 虚拟化和 EBS 支持的存储。采用 5.13.0 之前的 Amazon EMR 发行版时，有些上一代实例使用 PVM 虚拟化。有关更多信息，请参阅 [Linux AMI 虚拟化类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。
+ 由于缺乏硬件支持和默认设置，可能会导致内存和核心利用率不足，因此如果运行低于 5.36.1 和 6.10.0 的 Amazon EMR 发行版，我们不建议使用 `c7a`、`c7i`、`m7i`、`m7i-flex`、`r7a`、`r7i`、`r7iz`、`i4i.12xlarge`、`i4i.24xlarge` 等实例类型。如果在这些发行版中运行上述实例类型，可能会降低性能，也不会看到新实例类型的预期优势，比如 `c7i` 和 `c6i`。要在这些性能类型下实现最佳资源利用率和性能，应运行 5.36.1 及更高版本或 6.10.0 及更高版本，以最大限度发挥其功能。
+ 一些实例类型支持增强联网。有关更多信息，请参阅[有关 Linux 的增强联网](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking.html)。
+ NVIDIA 和 CUDA 驱动程序默认安装在 GPU 实例类型上。

## 支持的实例类型由 AWS 区域
<a name="emr-instance-types-by-region"></a>

下表列出了 Amazon EMR 支持的 Amazon EC2 实例类型，按其整理。 AWS 区域该表还列出了支持各实例类型的 5.x、6.x 和 7.x 系列中最早的 Amazon EMR 发行版。

### 美国东部（弗吉尼亚州北部）- us-east-1
<a name="us-east-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 美国东部（俄亥俄）- us-east-2
<a name="us-east-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 美国西部（加利福尼亚北部）：us-west-1
<a name="us-west-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 美国西部（俄勒冈）- us-west-2
<a name="us-west-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### AWS GovCloud （美国西部）--1 us-gov-west
<a name="us-gov-west-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### AWS GovCloud (美国东部)--1 us-gov-east
<a name="us-gov-east-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 非洲（开普敦）- af-south-1
<a name="af-south-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（香港）- ap-east-1
<a name="ap-east-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（雅加达）：ap-southeast-3
<a name="ap-southeast-3-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（墨尔本）- ap-southeast-4
<a name="ap-southeast-4-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（马来西亚）- ap-southeast-5
<a name="ap-southeast-5-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（孟买）：ap-south-1
<a name="ap-south-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太（海得拉巴）- ap-south-2
<a name="ap-south-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（大阪）：ap-northeast-3
<a name="ap-northeast-3-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（首尔）：ap-northeast-2
<a name="ap-northeast-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（新加坡）：ap-southeast-1
<a name="ap-southeast-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（悉尼）- ap-southeast-2
<a name="ap-southeast-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（东京）- ap-northeast-1
<a name="ap-northeast-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 加拿大（中部）：ca-central-1
<a name="ca-central-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 加拿大西部（卡尔加里）- ca-west-1
<a name="ca-west-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 中国（宁夏）- cn-northwest-1
<a name="cn-northwest-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 中国（北京）- cn-north-1
<a name="cn-north-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（法兰克福）：eu-central-1
<a name="eu-central-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（苏黎世）- eu-central-2
<a name="eu-central-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（爱尔兰）：eu-west-1
<a name="eu-west-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（伦敦）：eu-west-2
<a name="eu-west-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲地区（米兰）- eu-south-1
<a name="eu-south-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（西班牙）- eu-south-2
<a name="eu-south-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（巴黎）：eu-west-3
<a name="eu-west-3-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 欧洲（斯德哥尔摩）：eu-north-1
<a name="eu-north-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 以色列（特拉维夫）- il-central-1
<a name="il-central-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 中东（巴林）- me-south-1
<a name="me-south-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 中东（阿联酋）- me-central-1
<a name="me-central-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 南美洲（圣保罗）：sa-east-1
<a name="sa-east-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（泰国）-ap-southeast-7
<a name="ap-southeast-7-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 墨西哥（中部）- mx-central-1
<a name="mx-central-1-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（台北）- ap-east-2
<a name="ap-east-2-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

### 亚太地区（新西兰）- ap-southeast-6
<a name="ap-southeast-6-supported-instances"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-supported-instance-types.html)

## 上一代实例
<a name="emr-supported-instance-types-previous-generation"></a>

Amazon EMR 支持上一代实例，以支持针对这些实例进行了优化且尚未升级的应用程序。有关这些实例类型和升级方法的更多信息，请参阅[上一代实例](https://aws.amazon.com/ec2/previous-generation)。


| 实例类 | 实例类型 | 
| --- | --- | 
|  General Purpose  |  m1.small¹ \$1 m1.medium¹ \$1 m1.large¹ \$1 m1.xlarge¹ \$1 m3.xlarge¹ \$1 m3.2xlarge¹ \$1 m4.large \$1 m4.xlarge \$1 m4.2xlarge \$1 m4.4xlarge \$1 m4.10xlarge \$1 m4.16xlarge  | 
|  Compute Optimized  |  c1.medium¹ ² \$1 c1.xlarge¹ \$1 c3.xlarge¹ \$1 c3.2xlarge¹ \$1 c3.4xlarge¹ \$1 c3.8xlarge¹ \$1 c4.large \$1 c4.xlarge \$1 c4.2xlarge \$1 c4.4xlarge \$1 c4.8xlarge  | 
|  Memory Optimized  |  m2.xlarge¹ \$1 m2.2xlarge¹ \$1 m2.4xlarge¹ \$1 r3.xlarge \$1 r3.2xlarge \$1 r3.4xlarge \$1 r3.8xlarge \$1 r4.xlarge \$1 r4.2xlarge \$1 r4.4xlarge \$1 r4.8xlarge \$1 r4.16xlarge  | 
|  Storage Optimized  |  d2.xlarge \$1 d2.2xlarge \$1 d2.4xlarge \$1 d2.8xlarge \$1 i2.xlarge \$1 i2.2xlarge \$1 i2.4xlarge \$1 i2.8xlarge  | 

¹ 使用 Amazon EMR 版本早于 5.13.0 的 PVM 虚拟化 AMI。有关更多信息，请参阅 [Linux AMI 虚拟化类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/virtualization_types.html)。

² 在版本 5.15.0 中不受支持。

# Amazon EMR 中的实例购买选项
<a name="emr-instance-purchasing-options"></a>

当您设置集群时，可以选择 Amazon EC2 实例的购买选项。您可以选择按需型实例和/或 Spot 实例。价格因实例类型和区域而异。Amazon EMR 价格不包括 Amazon EC2 价格（基础服务器的价格）和 Amazon EBS 价格（如果附上 Amazon EBS 卷）。有关当前定价，请参阅 [Amazon EMR 定价](https://aws.amazon.com/emr/pricing)。

您选择在集群中使用实例组还是实例队列将确定您在集群运行时更改实例购买选项的方式。如果您选择统一实例组，则您只能在创建实例组时为其指定购买选项，且实例类型和购买选项将应用于每个实例组中的所有 Amazon EC2 实例。如果您选择使用实例队列，则可在创建实例队列后更改购买选项，并可以组合购买选项以实现您指定的目标容量。有关这些配置的更多信息，请参阅[使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)。

## 按需实例
<a name="emr-instances-on-demand"></a>

对于按需型实例，您可以按小时为计算容量付费。（可选）您可以为这些按需型实例使用预留实例或专用实例购买选项。对于预留实例，您可以对实例进行一次性付款以预留容量。专用实例在主机硬件级别与属于其他 AWS 账户的实例进行物理隔离。有关购买选项的更多信息，请参阅《Amazon EC2 用户指南》**中的[实例购买选项](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-purchasing-options.html)。

### 使用预留实例
<a name="emr-instances-reserved"></a>

要在 Amazon EMR 中使用预留实例，您可以使用 Amazon EC2 购买预留实例并指定预留的参数，包括应用于区域或可用区时的预留范围。有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 预留实例](https://aws.amazon.com/ec2/reserved-instances/)和[购买预留实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-concepts-buying.html)。购买预留实例后，如果满足以下所有条件，则 Amazon EMR 会在集群启动时使用预留实例：
+ 在集群配置中指定匹配预留实例规范的按需实例
+ 在实例预留范围内启动集群（可用区或区域）
+ 预留实例容量仍可用

例如，假设您购买了一个 `m5.xlarge` 预留实例，其实例预留范围限于美国东部区域。然后，您在美国东部区域启动一个使用两个 `m5.xlarge` 实例的 Amazon EMR 集群。第一个实例按照预留实例费率计费，第二个实例按照按需费率计费。在创建任何按需型实例之前使用预留实例容量。

### 使用专用实例
<a name="emr-dedicated-instances"></a>

要使用专用实例，您可以先使用 Amazon EC2 购买专用实例，然后使用 **Dedicated (专用)** 租赁属性创建 VPC。随后，您在 Amazon EMR 中指定集群应在此 VPC 中启动。在集群启动时，集群中符合专用实例规范的任何按需型实例均使用可用的专用实例。

**注意**  
Amazon EMR 不支持对单个实例设置 `dedicated` 属性。

## 竞价型实例
<a name="emr-spot-instances"></a>

利用 Amazon EMR 中的竞价型实例，您能够以比按需购买更低的价格来购买 Amazon EC2 实例容量。使用竞价型实例的缺点是，如果您正在运行的实例类型的竞价型容量不可用，则实例可能会终止。有关何时使用适用于您应用程序的竞价型实例的更多信息，请参阅[什么时候应该使用竞价型实例？](emr-plan-instances-guidelines.md#emr-plan-spot-instances)。

当 Amazon EC2 拥有未利用的容量时，它会以更低的成本（称为 *Spot 价格*）提供 EC2 实例。此价格会根据可用性和需求发生波动，并且按区域和可用区制定。在选择竞价型实例时，您指定您愿意为每个 EC2 实例类型支付的最高 Spot 价格。当集群的可用区中的 Spot 价格低于为该实例类型指定的最高 Spot 价格时，实例将启动。在实例运行时，您支付的是当前 Spot 价格，*而不是您的最高 Spot 价格*。

**注意**  
自 2021 年 7 月 1 日起，新客户不再享有具有定义持续时间（也称为 Spot 块）的竞价型实例。对于以前使用过该功能的客户，我们将继续支持具有定义持续时间的竞价型实例，直到 2022 年 12 月 31 日。

要查看当前定价，请参阅 [Amazon EC2竞价型实例定价](https://aws.amazon.com/ec2/spot/pricing/)。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[竞价型实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)。在创建和配置集群时，您指定用于最终确定集群从中启动的可用区的网络选项。有关更多信息，请参阅[在 VPC 中为 Amazon EMR 配置联网](emr-plan-vpc-subnet.md)。

**提示**  
在使用 **Advanced Options (高级选项)** 创建集群的情况下，将鼠标悬停在 **Spot** 购买选项旁边的信息工具提示上方，即可在控制台中看到实时 Spot 价格。这将显示所选区域中每个可用区的价格。最低价格位于绿色行中。因为可用区之间的 Spot 价格会波动，所以，选择初始价格最低的可用区并不保证集群在整个使用期限的使用价格最低。要获得最佳结果，请在选择之前了解可用区定价的历史记录。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[竞价型实例定价历史记录](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances-history.html)。

Spot 实例选项取决于您在集群配置中使用统一实例组还是实例队列。

****统一实例组中的竞价型实例****  
当您使用统一实例组中的竞价型实例时，实例组中的所有实例必须是竞价型实例。您为集群指定一个子网或可用区。对于每个实例组，您指定一个竞价型实例和一个最高 Spot 价格。如果集群的区域和可用区中的 Spot 价格低于最高 Spot 价格，则该类型的竞价型实例将启动。如果 Spot 价格高于您的最高 Spot 价格，则实例将终止。仅在配置实例组时设置最高 Spot 价格。它可以在稍后更改。有关更多信息，请参阅[使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)。

****实例集中的竞价型实例****  
在使用实例队列配置时，可使用其它选项更好地控制竞价型实例启动和终止的方式。基本上，实例队列使用与统一实例组不同的方法来启动实例。其工作方式是，您为竞价型实例（和按需实例）确立*目标容量* 并创建最多 5 个实例类型。此外，您还可以为每个实例类型指定*权重容量*，或使用实例类型的 vCPU (YARN vcore) 作为权重容量。在预置该类型的实例时，此权重容量将计入目标容量。Amazon EMR 使用两个购买选项预置实例，直至达到每个目标的目标容量。此外，您可以为 Amazon EMR 定义一系列可用区，以便在启动实例时从中选择。您还为每个队列提供其他 Spot 选项，包括预置超时。有关更多信息，请参阅 [规划和配置 Amazon EMR 集群的实例集](emr-instance-fleet.md)。

# Amazon EMR 中的实例存储选项和行为
<a name="emr-plan-storage"></a>

## 概述
<a name="emr-plan-storage-ebs-storage-overview"></a>

实例存储和 Amazon EBS 卷存储用于 HDFS 数据，以及缓冲区、缓存、Scratch 数据和一些应用程序可能“溢出”到本地文件系统中的其他临时内容。

Amazon EBS 在 Amazon EMR 中的工作方式与常规 Amazon EC2 实例的工作方式不同。附加到 Amazon EMR 集群的 Amazon EBS 卷是临时的：这些卷在集群和实例终止时（例如，在缩减实例组时）将被删除，因此您不应指望数据能持久保留。虽然数据是临时存在的，但有可能可以复制 HDFS 中的数据，具体取决于集群中的节点数目和规范。在添加 Amazon EBS 存储卷时，这些卷将作为附加卷进行安装。它们不是引导卷的一部分。YARN 已配置为使用所有附加卷，但您负责将附加卷作为本地存储（例如，针对本地日志文件）分配。

## 注意事项
<a name="emr-plan-storage-ebs-storage-considerations"></a>

在将 Amazon EBS 与 EMR 集群结合使用时，请记住以下其他注意事项：
+ 您无法拍摄 Amazon EBS 卷快照，然后在 Amazon EMR 中将其还原。要创建可重复使用的自定义配置，请使用自定义 AMI（在 Amazon EMR 版本 5.7.0 和更高版本中提供)。有关更多信息，请参阅[使用自定义 AMI 为 Amazon EMR 集群配置提供更大的灵活性](emr-custom-ami.md)。
+ 只有在使用自定义 AMI 时，才支持加密的 Amazon EBS 根设备卷。有关更多信息，请参阅[创建带加密 Amazon EBS 根设备卷的自定义 AMI](emr-custom-ami.md#emr-custom-ami-encrypted)。
+ 如果使用 Amazon EMR API 应用标签，则这些操作将适用于 EBS 卷。
+ 每个实例最多有 25 个卷。
+ 核心节点上的 Amazon EBS 卷不得小于 5GB。
+ Amazon EBS 的固定限制为每个实例启动请求 2500 个 EBS 卷。此限制也适用于 Amazon EMR on EC2 集群。我们建议您启动 EBS 卷总数在此限制范围内的集群，然后根据需要手动纵向扩展集群或使用 Amazon EMR 托管式自动扩缩功能。要了解有关 EBS 卷限制的更多信息，请参阅[服务配额](https://docs.aws.amazon.com/general/latest/gr/ebs-service.html#limits_ebs:~:text=Amazon%20EBS%20has,exceeding%20the%20limit.)。

## 实例的默认 Amazon EBS 存储
<a name="emr-plan-storage-ebs-storage-default"></a>

对于仅具有 EBS 存储的 EC2 实例，Amazon EMR 会将 Amazon EBS gp2 或 gp3 存储卷分配给实例。在使用 Amazon EMR 5.22.0 和更高版本创建集群时，默认的 Amazon EBS 存储量相对于实例大小而增加。

我们会将任何增加的存储拆分到多个卷中。这样将提高 IOPS 性能，相应地又会提高某些标准化工作负载的性能。如果要使用其他 Amazon EBS 实例存储配置，您可以在创建 EMR 集群或将节点添加到现有集群时指定该配置。您可以将 Amazon EBS gp2 或 gp3 卷用作根卷，并将 gp2 或 gp3 卷添加为附加卷。有关更多信息，请参阅 [指定额外的 EBS 存储卷](#emr-plan-storage-additional-ebs-volumes)。

下表列出了每种实例类型的默认 Amazon EBS gp2 存储卷数量、大小以及总大小。有关 gp2 卷与 gp3 相比较的信息，请参阅 [比较 Amazon EBS 卷类型 gp2 和 gp3](emr-plan-storage-compare-volume-types.md)。


**Amazon EMR 5.22.0 和更高版本的默认 Amazon EBS gp2 存储卷和大小（按实例类型划分）**  

| 实例大小 | 卷数 | 卷大小（GiB） | 总大小（GiB） | 
| --- | --- | --- | --- | 
|  \$1.large  |  1  |  32  |  32  | 
|  \$1.xlarge  |  2  |  32  |  64  | 
|  \$1.2xlarge  |  4  |  32  |  128  | 
|  \$1.4xlarge  |  4  |  64  |  256  | 
|  \$1.8xlarge  |  4  |  128  |  512  | 
|  \$1.9xlarge  |  4  |  144  |  576  | 
|  \$1.10xlarge  |  4  |  160  |  640  | 
|  \$1.12xlarge  |  4  |  192  |  768  | 
|  \$1.16xlarge  |  4  |  256  |  1024  | 
|  \$1.18xlarge  |  4  |  288  |  1152  | 
|  \$1.24xlarge  |  4  |  384  |  1536  | 

## 实例的默认 Amazon EBS 根卷
<a name="emr-plan-storage-ebs-root-volume"></a>

随着亚马逊 EMR 6.15 及更高版本的发布，亚马逊 EMR 会自动连接亚马逊 EBS 通用固态硬盘 (gp3) 作为其根设备，以增强性能。 AMIs 使用较早的版本时，Amazon EMR 将 EBS 通用型 SSD（gp2）附加作为根设备。


|  | 6.15 及更高版本 | 6.14 及更低版本 | 
| --- | --- | --- | 
| 默认的根卷类型 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html) | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html) | 
| 默认大小 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html)  | 
| 默认 IOPS |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html)  |   | 
| 默认吞吐量 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/emr-plan-storage.html)  |   | 

有关如何自定义 Amazon EBS 根设备卷的信息，请参阅 [指定额外的 EBS 存储卷](#emr-plan-storage-additional-ebs-volumes)。

## 指定额外的 EBS 存储卷
<a name="emr-plan-storage-additional-ebs-volumes"></a>

在 Amazon EMR 中配置实例类型时，可以指定其它 EBS 卷来添加实例存储（如果存在）和默认 EBS 卷之外添加容量。Amazon EBS 提供以下卷类型：通用型（SSD）、预置 IOPS（SSD）、吞吐优化（SSD）、冷数据（SSD）和磁性介质。它们的性能特点和价格不同，您可根据应用程序的分析和业务需求定制您的存储。例如，一些应用程序可能需要溢出到磁盘，而其它应用程序可在内存中或使用 Amazon S3 安全工作。

您只能在集群启动时以及添加额外的任务节点实例组时将 Amazon EBS 卷附加到实例。如果 Amazon EMR 集群中的某个实例失败，则该实例及其附加的 Amazon EBS 卷将被替换为新卷。因此，如果您手动分离 Amazon EBS 卷，Amazon EMR 会将此操作视为失败并替换实例存储（如果适用）和卷存储。

Amazon EMR 不允许您将现有 EMR 集群的卷类型从 gp2 修改为 gp3。要将 gp3 用于工作负载，请启动一个新的 EMR 集群。此外，我们不建议更新正在使用或正在预调配的集群的吞吐量和 IOPS，因为 Amazon EMR 将您在集群启动时指定的吞吐量和 IOPS 值用于在集群纵向扩展期间添加的任何新实例。有关更多信息，请参阅[比较 Amazon EBS 卷类型 gp2 和 gp3](emr-plan-storage-compare-volume-types.md)和[迁移到 gp3 Amazon EBS 卷类型时选择 IOPS 和吞吐量](emr-plan-storage-gp3-migration-selection.md)。

**重要**  
要将 gp3 卷用于您的 EMR 集群，您必须启动新集群。

# 比较 Amazon EBS 卷类型 gp2 和 gp3
<a name="emr-plan-storage-compare-volume-types"></a>

以下是美国东部（弗吉尼亚州北部）区域 gp2 和 gp3 卷的成本比较。有关最新信息，请参阅 [Amazon EBS 通用卷](https://aws.amazon.com/ebs/general-purpose/)产品页面和 [Amazon EBS 定价页](https://aws.amazon.com/ebs/pricing/)。


| 卷类型 | gp3 | gp2 | 
| --- | --- | --- | 
| 卷大小 | 1 GiB：16 TiB | 1GiB：16TiB | 
| 默认/基准 IOPS | 3000 | 3 IOPS/GiB （至少 100 IOPS）至最大 16,000 IOPS。小于 1TiB 的卷最高可突增至 3000 IOPS。 | 
| 每个卷的最大 IOPS | 16000 | 16000 | 
| 默认/基准吞吐量 | 125 MiB/s | 吞吐量限制在 128 到 MiB/s 250 MiB/s 之间，具体取决于卷大小。 | 
| 每个卷的最大吞吐量 | 1,000 MiB/s | 250 MiB/s | 
| 价格 | 每月 0.08 美元/Gib-3,000 个 IOPS 免费，每月 0.005 美元，预配置 IOPS 超过 3,000 美元；125 美元免费，预配置 0.04 美元 MiB/s MiB/s-month over 125MiB/s | 0.10 USD/GiB-月 | 

# 迁移到 gp3 Amazon EBS 卷类型时选择 IOPS 和吞吐量
<a name="emr-plan-storage-gp3-migration-selection"></a>

预调配 gp2 卷时，您必须计算出卷的大小才能获得成比例的 IOPS 和吞吐量。使用 gp3，您不必预调配更大的卷即可获得更高的性能。您可以根据应用需求选择所需的大小和性能。选择合适的大小和正确的性能参数（IOPS、吞吐量）可以最大限度地降低成本，而不会影响性能。

以下表格可帮助您选择 gp3 配置选项：


| 卷大小 | IOPS | 吞吐量 | 
| --- | --- | --- | 
| 1–170 GiB | 3000 | 125 MiB/s | 
| 170–334 GiB | 3000 |  MiB/s 如果所选的 EC2 实例类型支持 125 MiB/s or less, use higher as per usage, Max 250 MiB/s \$1，则为 125。 | 
| 334–1000 GiB | 3000 |  MiB/s 如果所选的 EC2 实例类型支持 125 MiB/s or less, Use higher as per usage, Max 250 MiB/s \$1，则为 125。 | 
| 1000\$1 GiB | 匹配 gp2 IOPS（大小（以 GiB 为单位）x 3）或由当前 gp2 卷驱动的最大 IOPS |  MiB/s 如果所选的 EC2 实例类型支持 125 MiB/s or less, Use higher as per usage, Max 250 MiB/s \$1，则为 125。 | 

\$1Gp3 能够提供高达 2000 的吞吐量）。MiB/s. Since gp2 provides a maximum of 250MiB/s throughput, you may not need to go beyond this limit when you use gp3. Gp3 volumes deliver a consistent baseline throughput performance of 125 MiB/s, which is included with the price of storage. You can provision additional throughput (up to a maximum of 2,000 MiB/s) for an additional cost at a ratio of 0.25 MiB/s per provisioned IOPS. Maximum throughput can be provisioned at 8,000 IOPS or higher and 16 GiB or larger (8,000 IOPS × 0.25 MiB/s per IOPS = 2,000 MiB/s

# 在 VPC 中为 Amazon EMR 配置联网
<a name="emr-plan-vpc-subnet"></a>

大多数集群都使用 Amazon Virtual Private Cloud（Amazon VPC）启动到虚拟网络。VPC 是其中的一个隔离虚拟网络 AWS ，在您的 AWS 账户中逻辑上是隔离的。您可以对私有 IP 地址范围、子网、路由表和网络网关等进行配置。有关更多信息，请参阅[《Amazon VPC 用户指南》](https://docs.aws.amazon.com/vpc/latest/userguide/)。

VPC 提供以下功能：
+ **处理敏感数据**

  在 VPC 中启动集群与使用路由表和网络等其他工具将集群启动到私有网络类似ACLs，用于定义谁有权访问该网络。如果您正在处理集群中的敏感数据，您可能希望获得在 VPC 中启动集群所提供的额外访问控制。此外，您还可以选择在私有子网中启动您的资源，其中，所有这些资源都没有直接的 Internet 连接。
+ **访问内部网络上的资源**

  如果您的数据源位于私有网络中，则将该数据上传到以导入 Amazon EMR 可能不切实际或不可取，这要么是因为要传输的数据量很大，要么是因为数据的敏感性。 AWS 相反，您可以在 VPC 中启动集群，并通过 VPN 连接将您的数据中心连接到 VPC，从而允许集群访问内部网络上的资源。例如，如果数据中心内有 Oracle 数据库，则在通过 VPN 连接到该网络的 VPC 中启动集群，可使集群能够访问 Oracle 数据库。

****公有子网和私有子网****  
您可以同时在公有 VPC 子网和私有 VPC 子网中启动 Amazon EMR 集群。这意味着您不需要互联网连接即可运行 Amazon EMR 集群；但是，您可能需要配置网络地址转换 (NAT) 和 VPN 网关才能访问位于 VPC 之外的服务或资源，例如企业内部网或公共 AWS 服务终端节点（例如）。 AWS Key Management Service

**重要**  
Amazon EMR 仅支持在版本 4.2 及更高版本中的私有子网中启动集群。

有关 Amazon VPC 的更多信息，请参阅 [Amazon VPC 用户指南](https://docs.aws.amazon.com/vpc/latest/userguide/)。

**Topics**
+ [启动集群时的 Amazon VPC 选项](emr-clusters-in-a-vpc.md)
+ [设置 VPC 以托管 Amazon EMR 集群](emr-vpc-host-job-flows.md)
+ [使用 Amazon EMR 在 VPC 中启动集群](emr-vpc-launching-job-flows.md)
+ [访问 Amazon S3 的私有子网的示例策略](private-subnet-iampolicy.md)
+ [更多可供学习的资源 VPCs](#emr-resources-about-vpcs)

# 启动集群时的 Amazon VPC 选项
<a name="emr-clusters-in-a-vpc"></a>



在 VPC 中启动 Amazon EMR 集群时，您可以在公有子网、私有子网或共享子网中启动它。配置上存在少量但明显的区别，具体取决于您为集群选择的子网类型。

## 公有子网
<a name="emr-vpc-public-subnet"></a>

公有子网中的 EMR 集群需要已连接的 Internet 网关。这是因为 Amazon EMR 集群必须访问 AWS 服务和亚马逊 EMR。如果可利用某项服务（如 Amazon S3）创建 VPC 终端节点，则可使用该终端节点访问这些服务，而不是通过互联网网关访问公有终端节点。此外，Amazon EMR 无法通过网络地址转换（NAT）设备与公有子网中的集群通信。为此，需要一个 Internet 网关，但您仍可在更复杂的场景中为其它流量使用 NAT 实例或网关。

集群中的所有实例都通过 VPC 终端节点或互联网网关连接到 Amazon S3。其他目前不支持 VPC 终端节点的 AWS 服务仅使用互联网网关。

如果您不想将其他 AWS 资源连接到 Internet 网关，则可以在您的 VPC 内创建的私有子网中启动这些组件。

在公有子网中运行的集群将使用两个安全组：一个用于主节点，另一个用于核心节点和任务节点。有关更多信息，请参阅 [使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md)。

下图说明 Amazon EMR 集群如何在带公有子网的 VPC 中运行。集群能够通过互联网网关连接到其他 AWS 资源，例如 Amazon S3 存储桶。

![\[VPC 上的集群\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/vpc_default_v3a.png)


下图演示如何设置 VPC，以便 VPC 中的集群可以访问您自己的网络中的资源 (如 Oracle 数据库)。

![\[设置 VPC 和集群以访问本地 VPN 资源\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/vpc_withVPN_v3a.png)


## 私有子网
<a name="emr-vpc-private-subnet"></a>

私有子网允许您启动 AWS 资源，而无需子网连接 Internet 网关。Amazon EMR 支持在发行版本 4.2.0 及更高版本的私有子网中启动集群。

**注意**  
当您在私有子网中设置 Amazon EMR 集群时，我们建议您也[为 Amazon S3 设置 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html)。如果您的 EMR集群处于没有适用于 Amazon S3 的 VPC 端点的私有子网中，则您需要为与 S3 流量关联的其他 NAT 网关付费，因为您的 EMR 集群与 S3 之间的流量不是位于您的 VPC 内。

私有子网与公有子网的区别在以下方面：
+ 要访问不提供 VPC 终端节点的 AWS 服务，您仍然必须使用 NAT 实例或互联网网关。
+ 您至少必须在 Amazon S3 中提供到 Amazon EMR 服务日志存储桶和 Amazon Linux 存储库的路由。有关更多信息，请参阅[访问 Amazon S3 的私有子网的示例策略](private-subnet-iampolicy.md)。
+ 如果您使用 EMRFS 功能，则需要有一个 Amazon S3 VPC 终端节点和一个从私有子网到 DynamoDB 的路由。
+ 调试仅在您提供一个从私有子网到公有 Amazon SQS 终端节点的情况下起作用。
+ 仅支持使用 AWS 管理控制台在公有子网中通过 NAT 实例或网关创建私有子网配置。为 EMR 集群添加和配置 NAT 实例和 Amazon S3 VPC 终端节点的最简单方法是，使用 Amazon EMR 控制台中的 **VPC Subnets List (VPC 子网列表)** 页面。要配置 NAT 网关，请参阅《Amazon VPC 用户指南》**中的 [NAT 网关](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。
+ 您无法利用现有 Amazon EMR 集群将子网从公有子网更改为私有子网，反之亦然。要在私有子网中找到 Amazon EMR 集群，则必须在私有子网中启动该集群。

Amazon EMR 为私有子网中的集群创建和使用不同的默认安全组： ElasticMapReduce-Master-Private、ElasticMapReduce-Slave-Private 和-。 ElasticMapReduce ServiceAccess有关更多信息，请参阅 [使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md)。

要查看您的集群 NACLs 的完整列表，请在 Amazon EMR 控制台的 “集**群详情” 页面上选择 “主****集群****的安全组” 和 “核心与任务**” 的安全组。

下图说明如何在私有子网中配置 Amazon EMR 集群。子网外部的唯一通信是到 Amazon EMR 的通信。

![\[在私有子网中启动 Amazon EMR 集群\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/vpc_with_private_subnet_v3a.png)


下图显示已连接到公有子网中的 NAT 实例的私有子网中的 Amazon EMR 集群的示例配置。

![\[连接到 NAT 的私有子网\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/vpc_private_subnet_nat_v3a.png)


## 共享子网
<a name="emr-vpc-shared-subnet"></a>

VPC 共享允许客户与同一 AWS 组织内的其他 AWS 账户共享子网。您可以将 Amazon EMR 集群启动到公有共享子网和私有共享子网中，但需要注意以下几点。

子网拥有者必须与您共享一个子网才能在其中启动 Amazon EMR 集群。但是，共享子网稍后可以取消共享。有关更多信息，请参阅[使用共享 VPCs](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。当某个集群启动到共享子网并且该共享子网随后取消共享时，您可以在子网取消共享时根据 Amazon EMR 集群状态观察特定行为。
+ 在集群成功启动*之前*，子网未取消共享 - 如果拥有者在参与者启动集群时停止共享 Amazon VPC 或子网，则集群可能无法启动或部分初始化，而无需预置请求的所有实例。
+ 集群成功启动*之后*，子网未取消共享 - 当拥有者停止与参与者共享子网或 Amazon VPC 时，参与者的集群将无法调整大小以添加新实例或替换不健康的实例。

当您启动一个 Amazon EMR 集群时，系统会创建多个安全组。在共享子网中，子网参与者控制这些安全组。子网拥有者可以看到这些安全组，但不能对其执行任何操作。如果子网拥有者想要删除或修改安全组，则创建安全组的参与者必须执行该操作。

## 使用 IAM 控制 VPC 权限
<a name="emr-iam-on-vpc"></a>

默认情况下，所有 用户都可以查看该账户的所有子网，且任何用户都可以在任何子网中启动集群。

当您将集群启动到 VPC 中时，您可以使用 AWS Identity and Access Management (IAM) 来控制对集群的访问权限并使用策略限制操作，就像在 Amazon EC2 Classic 中启动的集群一样。有关 IAM 的更多信息，请参阅 [IAM 用户指南](https://docs.aws.amazon.com/IAM/latest/UserGuide/)。

您还可以使用 IAM 控制可以创建和管理子网的人员。例如，您可以创建一个 IAM 角色来管理子网，再创建第二个角色来启动集群，但无法修改 Amazon VPC 设置。有关在 Amazon EC2 和 Amazon VPC 中管理策略和操作的更多信息，请参阅《Amazon EC2 用户指南》**中的[适用于 Amazon EC2 的 IAM 策略](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html)。

# 设置 VPC 以托管 Amazon EMR 集群
<a name="emr-vpc-host-job-flows"></a>

您必须先创建 VPC 和子网，然后才能在 VPC 中启动集群。对于公有子网，您必须创建一个 Internet 网关并将它连接到子网。以下说明介绍如何创建能够托管 Amazon EMR 集群的 VPC。

**为 Amazon EMR 集群创建带有子网的 VPC**

1. 打开位于 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 的 Amazon VPC 控制台。

1. 在页面右上角，为 VPC 选择 [AWS 区域](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)。

1. 选择**创建 VPC**。

1. 在 **VPC settings**（VPC 设置）页面上，选择 **VPC and more**（VPC 等）。

1. 在 **Name tag auto-generation**（名称标签自动生成）下，启用 **Auto-generate**（自动生成）然后输入 VPC 的名称。这可帮助您在创建 VPC 和子网后在 Amazon VPC 控制台中识别它们。

1. 在 **IPv4 CIDR 块**字段中，输入您的 VPC 的私有 IP 地址空间以确保正确解析的 DNS 主机名；否则，您可能会遇到 Amazon EMR 集群故障。该地址空间包括以下 IP 地址范围：
   + 10.0.0.0 - 10.255.255.255
   + 172.16.0.0 - 172.31.255.255
   + 192.168.0.0 - 192.168.255.255

1. 在**可用区数量 (AZs)** 下，选择要在其中启动子网的可用区数量。

1. 在 **Number of public subnets**（公有子网数量）下，选择要添加到 VPC 的单个公有子网。如果集群中使用的数据可在 Internet 上（例如，在 Amazon S3 或 Amazon RDS 中）使用，则只需使用公有子网，无需添加私有子网。

1. 在 **Number of private subnets**（私有子网数量）下，选择要添加到 VPC 的私有子网数量。如果您的应用程序数据存储在您自己的网络中（例如，在 Oracle 数据库中），则选择一个或多个私有子网。对于私有子网中的 VPC，所有 Amazon EC2 实例都必须至少有一个通过弹性网络接口到 Amazon EMR 的路由。在控制台中，将自动为您进行配置。

1. 在 **NAT gateways**（NAT 网关）下，可选择添加 NAT 网关。仅当您的私有子网需要与 Internet 通信的情况下，才需要使用它们。

1. 在 **VPC endpoints**（VPC 端点）下，选择向子网添加 Amazon S3 的端点。

1. 验证是否已选中 **Enable DNS hostnames**（启用 DNS 主机名）和 **Enable DNS resolution**（启用 DNS 解析）。有关更多信息，请参阅[将 DNS 与您的 VPC 一起使用](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。

1. 选择**创建 VPC**。

1. 状态窗口会显示工作的进度。工作完成后，选择**查看 VPC** 以导航到**您的VPCs**页面，其中显示您的默认 VPC 和您刚刚创建的 VPC。您创建的 VPC 是非默认 VPC，因此 **Default VPC** 列将显示 **No**。

1. 如果您想将 VPC 与不包含域名的 DNS 条目相关联，请导航到 **DHCP option sets**（DHCP 选项集），选择 **Create DHCP options set**（创建 DHCP 选项集）然后省略域名。创建选项集后，导航到新 VPC，选择 **Actions**（操作）菜单下的 **Edit DHCP options set**（编辑 DHCP 选项集），然后选择新选项集。创建了 DNS 选项集之后，您无法使用控制台编辑域名。

   这是针对 Hadoop 和相关应用程序的最佳做法，可确保解析节点的完全限定域名 (FQDN)。要确保正确解析 DNS，请配置 VPC，使其包含将参数设置为以下值的 DHCP 选项集：
   + **domain-name** = **ec2.internal**

     如果您所在的区域是美国东部（弗吉尼亚北部），请使用 **ec2.internal**。对于其他地区，请使用*region-name***.compute.internal**。例如，在 `us-west-2` 中，请使用 **us-west-2.compute.internal**。对于 AWS GovCloud （美国西部）区域，请使用**us-gov-west-1.compute.internal**。
   + **domain-name-servers** = **AmazonProvidedDNS**

   有关更多信息，请参阅《Amazon VPC 用户指南》**中的 [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。

1. 创建 VPC 之后，转到 **Subnets**（子网）页面并记下新 VPC 的一个子网的 **Subnet ID**（子网 ID）。在该 VPC 中启动 Amazon EMR 集群时，您将使用此信息。

# 使用 Amazon EMR 在 VPC 中启动集群
<a name="emr-vpc-launching-job-flows"></a>

在具有一个配置为托管 Amazon EMR 集群的子网后，通过在创建集群时指定关联的子网标识符来在该子网中启动集群。

**注意**  
Amazon EMR 支持版本 4.2 及更高版本中的私有子网。

启动集群时，Amazon EMR 基于集群是在 VPC 私有子网还是公有子网中启动来添加安全组。所有安全组都允许端口 8443 的入口与 Amazon EMR 服务进行通信，但 IP 地址范围因公有子网和私有子网而异。Amazon EMR 管理所有这些安全组，随着时间的推移，可能需要向该 AWS 安全组添加额外的 IP 地址。有关更多信息，请参阅 [使用 Amazon EMR 集群的安全组控制网络流量](emr-security-groups.md)。

为了管理 VPC 上的集群，Amazon EMR 为主节点附加了一个网络设备，并通过该设备对主节点进行管理。您可以使用 Amazon EC2 API 操作 [https://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeInstances.html) 查看此设备。如果您以任何方式修改此设备，则集群可能会失败。

------
#### [ Console ]

**使用控制台在 VPC 中启动集群**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Networking**（联网）下，转到 **Virtual private cloud (VPC)** [虚拟私有云（VPC）] 字段。输入 VPC 名称或选择 **Browse**（浏览）以选择 VPC。或者，选择 **Create VPC**（创建 VPC）以创建可用于集群的 VPC。

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

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ AWS CLI ]

**要在 VPC 中启动集群，请使用 AWS CLI**
**注意**  
 AWS CLI 不提供自动创建 NAT 实例并将其连接到私有子网的方法。但是，要在子网中创建 S3 端点，您可以使用 Amazon VPC CLI 命令。使用控制台可在私有子网中创建 NAT 实例和启动集群。

配置 VPC 之后，可以使用带 `create-cluster` 参数的 `--ec2-attributes` 子命令在 VPC 中启动 Amazon EMR 集群。使用 `--ec2-attributes` 参数可为集群指定 VPC 子网。
+ 要在特定子网中创建集群，请键入以下命令，*myKey*替换为您的 Amazon EC2 密钥对的名称，然后*77XXXX03*替换为您的子网 ID。

  ```
  aws emr create-cluster --name "Test cluster" --release-label emr-4.2.0 --applications Name=Hadoop Name=Hive Name=Pig --use-default-roles --ec2-attributes KeyName=myKey,SubnetId=subnet-77XXXX03 --instance-type m5.xlarge --instance-count 3
  ```

  如果不使用 `--instance-groups` 参数指定实例计数，则将启动单个主节点，其余实例将作为核心节点启动。所有节点都使用该命令中指定的实例类型。
**注意**  
如果您之前未创建默认 Amazon EMR 服务角色和 EC2 实例配置文件，请先键入 `aws emr create-default-roles` 创建它们，然后再键入 `create-cluster` 子命令。

------

## 确保 EC2 上的 EMR 集群有可用的 IP 地址
<a name="emr-vpc-launching-job-flows-ip-availability"></a>

为确保启动时子网有足够的 IP 地址可用，EC2 子网选择会检查 IP 可用性。即使在初始创建时只创建了集群的核心节点，创建过程也会使用具有必要 IP 地址数量的子网来启动所需的核心节点、主节点和任务节点。EMR 会在创建过程中检查启动主节点和任务节点所需的 IP 地址数量，并单独计算启动核心节点所需的 IP 地址数量。Amazon EMR 会自动确定所需的主实例和任务实例或节点的最小数量。

**重要**  
如果 VPC 中没有子网有足够的可用空间 IPs 来容纳基本节点，则会返回错误并且不会创建集群。

在大多数部署情况下，每次启动核心节点、主节点和任务节点之间都会有时间差。此外，多个集群可以共享一个子网。在这些情况下，IP 地址的可用性可能会发生波动，例如，后续任务节点的启动可能会受到可用 IP 地址的限制。

# 访问 Amazon S3 的私有子网的示例策略
<a name="private-subnet-iampolicy"></a>

对于私有子网，您必须让 Amazon EMR 至少能够访问 Amazon Linux 存储库。此私有子网策略是用于访问 Amazon S3 的 VPC 终端节点策略的一部分。

对于 Amazon EMR 5.25.0 或更高版本，要启用一键访问持久性 Spark 历史记录服务器，您必须允许 Amazon EMR 访问收集 Spark 事件日志的系统存储桶。如果启用日志记录，请为以下存储桶提供 PUT 权限：

```
aws157-logs-${AWS::Region}/*
```

有关更多信息，请参阅[一键访问持久性 Spark 历史记录服务器](https://docs.aws.amazon.com/emr/latest/ManagementGuide/app-history-spark-UI.html)。

由您决定满足业务需求的策略限制。以下示例策略提供了访问 Amazon Linux 存储库和 Amazon EMR 系统存储桶以收集 Spark 事件日志的权限。其中显示了存储桶的一些示例资源名称。

有关将 IAM policy 与 Amazon VPC 终端节点结合使用的更多信息，请参阅[Amazon S3 终端节点策略](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-s3.html#vpc-endpoints-policies-s3)。

以下策略示例包含 us-east-1 区域的示例资源。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AmazonLinuxAMIRepositoryAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::packages.us-east-1.amazonaws.com/*",
        "arn:aws:s3:::repo.us-east-1.amazonaws.com/*"
      ]
    },
    {
      "Sid": "EnableApplicationHistory",
      "Effect": "Allow",
      "Action": [
        "s3:Put*",
        "s3:Get*",
        "s3:Create*",
        "s3:Abort*",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::prod.us-east-1.appinfo.src/*"
      ]
    }
  ]
}
```

------

以下示例策略提供了访问 us-east-1 区域中的 Amazon Linux 2 存储库所需的权限。

```
{
   "Statement": [
       {
           "Sid": "AmazonLinux2AMIRepositoryAccess",
           "Effect": "Allow",
           "Principal": "*",
           "Action": "s3:GetObject",
           "Resource": [
           	"arn:aws:s3:::amazonlinux.us-east-1.amazonaws.com/*",
           	"arn:aws:s3:::amazonlinux-2-repos-us-east-1/*"
           ]
       }
   ]
}
```

以下示例策略提供了访问 us-east-1 区域中的 Amazon Linux 2023 存储库所需的权限。

```
{       
    "Statement": [                                       
        {                                                        
            "Sid": "AmazonLinux2023AMIRepositoryAccess",
            "Effect": "Allow",           
            "Principal": "*",                    
            "Action": "s3:GetObject",                    
            "Resource": [                                
                 "arn:aws:s3:::al2023-repos-us-east-1-de612dc2/*"
            ]                                            
        }                                                
    ]                                                    
 }
```

## 可用区
<a name="private-subnet-iampolicy-regions"></a>

下表包含按区域划分的存储桶列表，其中包括存储库的 Amazon 资源名称（ARN）和表示 `appinfo.src` ARN 的字符串。ARN 或 Amazon 资源名称是一个 AWS 用于唯一标识资源的字符串。


| Region | 存储库存储桶 | AppInfo 水桶 | 
| --- | --- | --- | 
| 美国东部（俄亥俄） | "arn:aws:s3:::packages.us-east-2.amazonaws.com/","arn:aws:s3:::repo.us-east-2.amazonaws.com/","arn:aws:s3:::repo.us-east-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.us-east-2.appinfo.src/\$1" | 
| 美国东部（弗吉尼亚北部） | "arn:aws:s3:::packages.us-east-1.amazonaws.com/","arn:aws:s3:::repo.us-east-1.amazonaws.com/","arn:aws:s3:::repo.us-east-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.us-east-1.appinfo.src/\$1" | 
| 美国西部（加利福尼亚北部） | "arn:aws:s3:::packages.us-west-1.amazonaws.com/","arn:aws:s3:::repo.us-west-1.amazonaws.com/","arn:aws:s3:::repo.us-west-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.us-west-1.appinfo.src/\$1" | 
| 美国西部（俄勒冈） | "arn:aws:s3:::packages.us-west-2.amazonaws.com/","arn:aws:s3:::repo.us-west-2.amazonaws.com/","arn:aws:s3:::repo.us-west-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.us-west-2.appinfo.src/\$1" | 
| 非洲（开普敦） | "arn:aws:s3:::packages.af-south-1.amazonaws.com/","arn:aws:s3:::repo.af-south-1.amazonaws.com/","arn:aws:s3:::repo.af-south-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.af-south-1.appinfo.src/\$1" | 
| 非洲（开普敦） | "arn:aws:s3:::packages.ap-east-1.amazonaws.com/","arn:aws:s3:::repo.ap-east-1.amazonaws.com/","arn:aws:s3:::repo.ap-east-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-east-1.appinfo.src/\$1" | 
| 亚太地区（海得拉巴） | "arn:aws:s3:::packages.ap-south-2.amazonaws.com/","arn:aws:s3:::repo.ap-south-2.amazonaws.com/","arn:aws:s3:::repo.ap-south-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-south-2.appinfo.src/\$1" | 
| 亚太地区（雅加达） | "arn:aws:s3:::packages.ap-southeast-3.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-3.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-3.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-southeast-3.appinfo.src/\$1" | 
| 亚太地区（马来西亚） | "arn:aws:s3:::packages.ap-southeast-5.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-5.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-5.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-southeast-5.appinfo.src/\$1" | 
| 亚太地区（墨尔本） | "arn:aws:s3:::packages.ap-southeast-4.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-4.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-4.emr.amazonaws.com/\$1" | “arn: aws: s3::: prod.ap-south-4.appinfo.src/\$1” | 
| 亚太地区（孟买） | "arn:aws:s3:::packages.ap-south-1.amazonaws.com/","arn:aws:s3:::repo.ap-south-1.amazonaws.com/","arn:aws:s3:::repo.ap-south-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-south-1.appinfo.src/\$1" | 
| 亚太地区（大阪） | “arn: aws: s3:: packages.ap-northeast-3.amazonaws.com/”、“arn: aws: s3:: repo.ap-northeast-3.amazonaws.com/”、“arn: aws: s3::: repo.ap-northeast-3.emr.amazonaws.com/\$1” | “arn: aws: s3::: prod.ap-northeast-3.appinfo.src/\$1” | 
| 亚太地区（首尔） | "arn:aws:s3:::packages.ap-northeast-2.amazonaws.com/","arn:aws:s3:::repo.ap-northeast-2.amazonaws.com/","arn:aws:s3:::repo.ap-northeast-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-northeast-2.appinfo.src/\$1" | 
| 亚太地区（新加坡） | "arn:aws:s3:::packages.ap-southeast-1.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-1.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-southeast-1.appinfo.src/\$1" | 
| 亚太地区（悉尼） | "arn:aws:s3:::packages.ap-southeast-2.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-2.amazonaws.com/","arn:aws:s3:::repo.ap-southeast-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-southeast-2.appinfo.src/\$1" | 
| 亚太地区（东京） | "arn:aws:s3:::packages.ap-northeast-1.amazonaws.com/","arn:aws:s3:::repo.ap-northeast-1.amazonaws.com/","arn:aws:s3:::repo.ap-northeast-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ap-northeast-1.appinfo.src/\$1" | 
| 加拿大（中部） | "arn:aws:s3:::packages.ca-central-1.amazonaws.com/","arn:aws:s3:::repo.ca-central-1.amazonaws.com/","arn:aws:s3:::repo.ca-central-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ca-central-1.appinfo.src/\$1" | 
| 加拿大西部（卡尔加里） | "arn:aws:s3:::packages.ca-west-1.amazonaws.com/","arn:aws:s3:::repo.ca-west-1.amazonaws.com/","arn:aws:s3:::repo.ca-west-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.ca-west-1.appinfo.src/\$1" | 
| 欧洲地区（法兰克福） | "arn:aws:s3:::packages.eu-central-1.amazonaws.com/","arn:aws:s3:::repo.eu-central-1.amazonaws.com/","arn:aws:s3:::repo.eu-central-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-central-1.appinfo.src/\$1" | 
| 欧洲地区（爱尔兰） | "arn:aws:s3:::packages.eu-west-1.amazonaws.com/","arn:aws:s3:::repo.eu-west-1.amazonaws.com/","arn:aws:s3:::repo.eu-west-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-west-1.appinfo.src/\$1" | 
| 欧洲地区（伦敦） | "arn:aws:s3:::packages.eu-west-2.amazonaws.com/","arn:aws:s3:::repo.eu-west-2.amazonaws.com/","arn:aws:s3:::repo.eu-west-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-west-2.appinfo.src/\$1" | 
| 欧洲地区（米兰） | "arn:aws:s3:::packages.eu-south-1.amazonaws.com/","arn:aws:s3:::repo.eu-south-1.amazonaws.com/","arn:aws:s3:::repo.eu-south-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-south-1.appinfo.src/\$1" | 
| 欧洲（巴黎） | "arn:aws:s3:::packages.eu-west-3.amazonaws.com/","arn:aws:s3:::repo.eu-west-3.amazonaws.com/","arn:aws:s3:::repo.eu-west-3.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-west-3.appinfo.src/\$1" | 
| 欧洲（西班牙） | "arn:aws:s3:::packages.eu-south-2.amazonaws.com/","arn:aws:s3:::repo.eu-south-2.amazonaws.com/","arn:aws:s3:::repo.eu-south-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-south-2.appinfo.src/\$1" | 
| 欧洲地区（斯德哥尔摩） | "arn:aws:s3:::packages.eu-north-1.amazonaws.com/","arn:aws:s3:::repo.eu-north-1.amazonaws.com/","arn:aws:s3:::repo.eu-north-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-north-1.appinfo.src/\$1" | 
| 欧洲（苏黎世） | "arn:aws:s3:::packages.eu-central-2.amazonaws.com/","arn:aws:s3:::repo.eu-central-2.amazonaws.com/","arn:aws:s3:::repo.eu-central-2.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.eu-central-2.appinfo.src/\$1" | 
| 以色列（特拉维夫） | "arn:aws:s3:::packages.il-central-1.amazonaws.com/","arn:aws:s3:::repo.il-central-1.amazonaws.com/","arn:aws:s3:::repo.il-central-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.il-central-1.appinfo.src/\$1" | 
| 中东（巴林） | "arn:aws:s3:::packages.me-south-1.amazonaws.com/","arn:aws:s3:::repo.me-south-1.amazonaws.com/","arn:aws:s3:::repo.me-south-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.me-south-1.appinfo.src/\$1" | 
| 中东（阿联酋）： | "arn:aws:s3:::packages.me-central-1.amazonaws.com/","arn:aws:s3:::repo.me-central-1.amazonaws.com/","arn:aws:s3:::repo.me-central-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.me-central-1.appinfo.src/\$1" | 
| 南美洲（圣保罗） | "arn:aws:s3:::packages.sa-east-1.amazonaws.com/","arn:aws:s3:::repo.sa-east-1.amazonaws.com/","arn:aws:s3:::repo.sa-east-1.emr.amazonaws.com/\$1" | "arn:aws:s3:::prod.sa-east-1.appinfo.src/\$1" | 
| AWS GovCloud （美国东部） | “arn: aws: s3:: packages。 us-gov-east-1.amazonaws.com/”，“arn: aws: s3::: repo。 us-gov-east-1.amazonaws.com/”，“arn: aws: s3::: repo。 us-gov-east-1.emr.amazonaws.com/\$1” | “arn: aws: s3::: prod。 us-gov-east-1.appinfo.src/\$1” | 
| AWS GovCloud （美国西部） | “arn: aws: s3:: packages。 us-gov-west-1.amazonaws.com/”，“arn: aws: s3::: repo。 us-gov-west-1.amazonaws.com/”，“arn: aws: s3::: repo。 us-gov-west-1.emr.amazonaws.com/\$1” | "arn:aws:s3:::prod.me-south-1.appinfo.src/\$1" | 

## 更多可供学习的资源 VPCs
<a name="emr-resources-about-vpcs"></a>

使用以下主题了解有关 VPCs 和子网的更多信息。
+ VPC 中的私有子网
  + [场景 2：带有公有子网和私有子网 (NAT) 的 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html)
  + [NAT 实例](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_NAT_Instance.html)
  + [Amazon VPC NAT 实例的高可用性：示例](https://aws.amazon.com/articles/2781451301784570)
+ VPC 中的公有子网
  + [场景 1：带单个公有子网的 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario1.html)
+ 一般 VPC 信息
  + [Amazon VPC User Guide](https://docs.aws.amazon.com/vpc/latest/userguide/)
  + [VPC 对等](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-peering.html)
  + [在您的 VPC 中使用弹性网络接口](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_ElasticNetworkInterfaces.html)
  + [安全地连接到私有 VPC 中运行的 Linux 实例](https://blogs.aws.amazon.com/security/post/Tx3N8GFK85UN1G6/Securely-connect-to-Linux-instances-running-in-a-private-Amazon-VPC)

# 使用实例集或统一实例组创建 Amazon EMR 集群
<a name="emr-instance-group-configuration"></a>

当您创建集群并指定主节点、核心节点和任务节点的配置时，有两个配置选项。您可以使用*实例队列* 或*统一实例组*。您选择的配置选项适用于所有节点，将在集群的生命周期内应用，并且实例队列和实例组无法在集群中共存。实例集配置在 Amazon EMR 版本 4.8.0 和更高版本中可用（不包括 5.0.x 版）。

您可以使用 Amazon EMR 控制台 AWS CLI、或 Amazon EMR API 来创建具有任一配置的集群。从 AWS CLI使用 `create-cluster` 命令时，可使用 `--instance-fleets` 参数通过实例队列创建集群，也可使用 `--instance-groups` 参数通过统一实例组创建集群。

使用 Amazon EMR API 时的情况也是如此。您使用 `InstanceGroups` 配置指定一组 `InstanceGroupConfig` 对象，或使用 `InstanceFleets` 配置指定一组 `InstanceFleetConfig` 对象。

在 Amazon EMR 新控制台中，您可以在创建集群时选择使用实例组或实例集，并且可以选择对每个实例组或实例集使用竞价型实例。在 Amazon EMR 旧控制台中，如果您在创建集群时使用默认 **Quick Options**（快速选项）设置，Amazon EMR 会将统一实例组配置应用于集群并使用按需型实例。要将竞价型实例与统一实例组结合使用，或要配置实例队列或其它自定义设置，请选择 **Advanced Options (高级选项)**。

## 实例机群
<a name="emr-plan-instance-fleets"></a>

实例集配置提供了各种面向 Amazon EC2 实例的预置选项。每个节点类型均有一个实例集，使用任务实例集是可选的。使用或 Amazon EMR API 以及按需实例和竞价型实例的[分配策略](emr-instance-fleet.md#emr-instance-fleet-allocation-strategy)创建集群时，您最多可以为每个队列指定 5 个 EC2 实例类型， AWS CLI 或者为每个队列指定 30 个 EC2 实例类型。对于核心实例和任务实例集，您可以为按需型实例指定一个*目标容量*，再为竞价型实例指定一个目标容量。。Amazon EMR 选择指定实例类型的任意组合来满足目标容量，预置按需实例和竞价型实例。

对于主节点类型，Amazon EMR 会从实例列表中选择一个实例类型，然后您指定将其预配置为按需型实例还是竞价型实例。实例集还为竞价型实例和按需型购买提供了其它选项。Spot 实例选项包括指定在无法预置 Spot 容量时要执行的操作的超时以及启动 Spot 实例机群的首选分配策略（容量优化）。此外，还可以使用分配策略（最低价格）选项来启动按需型实例机群。如果您使用的服务角色不是 EMR 默认服务角色，或者在服务角色中使用了 EMR 托管式策略，则需要向自定义集群服务角色添加其它权限，以启用分配策略选项。有关更多信息，请参阅[Amazon EMR 的服务角色（EMR 角色）](emr-iam-role.md)。

有关配置实例集的更多信息，请参阅 [规划和配置 Amazon EMR 集群的实例集](emr-instance-fleet.md)。

## 统一实例组
<a name="emr-plan-instance-groups"></a>

统一实例组可提供比实例集简单的设置。每个 Amazon EMR 集群可包含最多 50 个实例组：一个主实例组（包含一个 Amazon EC2 实例）、一个核心实例组（包含一个或多个 EC2 实例）和最多 48 个可选任务实例组。每个核心和任务实例组可以包含任意数量的 Amazon EC2 实例。您可以通过手动添加和删除 Amazon EC2 实例来扩展每个实例组，也可以设置自动扩展。有关添加和删除实例的信息，请参阅[使用 Amazon EMR 集群扩展来适应不断变化的工作负载](emr-scale-on-demand.md)。

有关配置统一实例组的更多信息，请参阅[为 Amazon EMR 集群配置统一实例组](emr-uniform-instance-group.md)。

## 使用实例集和实例组
<a name="emr-plan-instance-topics"></a>

**Topics**
+ [实例机群](#emr-plan-instance-fleets)
+ [统一实例组](#emr-plan-instance-groups)
+ [使用实例集和实例组](#emr-plan-instance-topics)
+ [规划和配置 Amazon EMR 集群的实例集](emr-instance-fleet.md)
+ [重新配置 Amazon EMR 集群的实例集](instance-fleet-reconfiguration.md)
+ [在 Amazon EMR 中将容量预留与实例集结合使用](on-demand-capacity-reservations.md)
+ [为 Amazon EMR 集群配置统一实例组](emr-uniform-instance-group.md)
+ [Amazon EMR 集群的可用区灵活性](emr-flexibility.md)
+ [为竞价型实例配置 Amazon EMR 集群实例类型和最佳实践](emr-plan-instances-guidelines.md)

# 规划和配置 Amazon EMR 集群的实例集
<a name="emr-instance-fleet"></a>

**注意**  
实例集配置仅在 Amazon EMR 发行版 4.8.0 及更高版本（不包括 5.0.0 和 5.0.3）中可用。

Amazon EMR 集群的实例集配置允许您为 Amazon EC2 实例选择各种预置选项，并帮助您为集群中的各节点类型制定灵活而富有弹性的资源配置策略。

在实例集配置中，您可以为每个队列内的[按需实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html)和竞价型实例[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)指定*目标容量*。集群启动时，Amazon EMR 预置实例，直至达到目标。如果 Amazon EC2 在集群运行时因价格上涨或实例失败而回收 Spot 实例，Amazon EMR 会尝试将该实例替换为您指定的任何实例类型。这使得可在 Spot 价格高峰期间更轻松地重新获取容量。

在使用或 Amazon EMR API 以及按需实例和竞价型实例的[分配策略](#emr-instance-fleet-allocation-strategy)创建集群时，您最多可以为每个队列指定五种 Amazon EC2 实例类型以供亚马逊 EMR 在实现目标时使用，或者为每个队列指定最多 30 个 AWS CLI Amazon EC2 实例类型。

您也可以为不同的可用区选择多个子网。当 Amazon EMR 启动集群时，它会在这些子网中查找您指定的实例和购买选项。如果 Amazon EMR 在一个或多个可用区中检测到 AWS 大规模事件，Amazon EMR 会自动尝试将流量从受影响的可用区域引出，并尝试根据您的选择启动您在备用可用区创建的新集群。请注意，只有在创建集群时才能选择集群可用区。如果发生可用区中断，现有的集群节点不会在新的可用区中自动重新启动。

## **使用实例集的注意事项**
<a name="emr-key-feature-summary"></a>

在 Amazon EMR 中使用实例集时，请考虑以下事项。
+ 对于每个节点类型（主节点、核心节点和任务节点），您可以有一个实例集。您可以为上的每个队列指定最多五种 Amazon EC2 实例类型 AWS 管理控制台 （或者使用 AWS CLI 或 Amazon EMR API 和创建集群时，每个实例队列最多可指定 30 种类型）。[实例集的分配策略](#emr-instance-fleet-allocation-strategy)
+ Amazon EMR 选择任一或所有指定的 Amazon EC2 实例类型，使用 Spot 和按需购买选项进行预置。
+ 对于核心队列和任务队列，您可以设定 Spot 和按需型实例的目标容量。请使用分配给计入目标的每个 Amazon EC2 实例的 vCPU 或通用单位。Amazon EMR 预置实例，直至达到每个目标容量。对于主实例集，目标始终为一。
+ 您可以选择一个子网（可用区）或范围。如果您选择一个范围，Amazon EMR 会预置最适合的可用区中的容量。
+ 在指定竞价型实例的目标容量时：
  + 对于每个实例类型，指定最高 Spot 价格。如果 Spot 价格低于最高 Spot 价格，Amazon EMR 会预置竞价型实例。您按 Spot 价格付费，但这不一定是最高 Spot 价格。
  + 对于每个队列，定义预置竞价型实例的超时期限。如果 Amazon EMR 无法预置 Spot 容量，您可以改为终止集群或切换到预置按需容量。这仅适用于预置集群，而不适用于调整集群大小。如果超时期限在集群大小调整过程中结束，则未预置的竞价请求将无效，且不会转移到按需容量。
+ 对于每个队列，您可以为竞价型实例指定以下分配策略之一：价格容量优化、容量优化 capacity-optimized-prioritized、最低价格或在所有池中实现多元化。
+ 对于每个实例集，您可以为按需型实例应用以下分配策略：最低价格策略或优先策略。
+ 对于每个包含按需型实例的实例集，您可以选择应用容量预留选项。
+ 如果对实例集使用分配策略，则在为 EMR 集群选择子网时，需要考虑以下事项：
  + 当 Amazon EMR 为集群预置任务实例集时，会筛选出缺少足够可用 IP 地址的子网，以预置请求的 EMR 集群的所有实例。这包括集群启动期间主实例、核心实例和任务实例集所需的IP地址。然后，Amazon EMR 利用其分配策略，根据实例类型和具有足够 IP 地址的剩余子网来确定实例池，以启动集群。
  + 如果 Amazon EMR 因可用 IP 地址不足而无法启动整个集群，则会尝试找出有足够可用 IP 地址的子网，以启动基本（核心和主）实例集。在这种情况下，任务实例集将进入暂停状态，而不是因错误而终止集群。
  + 如果指定的子网都不包含足够的 IP 地址来配置基本核心和主实例集，集群启动将失败，并显示 **VALIDATION\$1ERROR**。这将触发严重性为 **CRITICAL** 的集群终止事件，告知您无法启动集群。为防止出现此问题，我们建议增加子网中的 IP 地址数量。
+ 如果您运行的是 Amazon EMR **emr-7.7.0** 及更高版本，并且您使用实例集的分配策略，则可以将集群纵向扩展到每个实例集最多 4000 个 EC2 实例和 14000 个 EBS 卷。对于低于 **emr-7.7.0** 的版本，集群的每个实例集最多只能纵向扩展到 2000 个 EC2 实例和 7000 个 EBS 卷。
+ 启动按需型实例时，可以为账户中的主节点、核心节点和任务节点使用开放或目标容量预留。对于采用实例集分配策略的按需型实例，可能会遇到容量不足的问题。我们建议指定多个实例类型，以实现多样化并减少容量不足的问题。有关更多信息，请参阅 [在 Amazon EMR 中将容量预留与实例集结合使用](on-demand-capacity-reservations.md)。

## 实例集选项
<a name="emr-instance-fleet-options"></a>

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

**Topics**
+ [**设置目标容量**](#emr-fleet-capacity)
+ [**启动选项**](#emr-fleet-spot-options)
+ [**多个子网（可用区）选项**](#emr-multiple-subnet-options)
+ [**主节点（master node）配置**](#emr-master-node-configuration)

### **设置目标容量**
<a name="emr-fleet-capacity"></a>

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

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

**重要**  
当您使用选择实例类型时 AWS 管理控制台，显示的每种实例类型**的 vCPU** 数量是该**实例类型**的 YARN vcore 数，而不是该实例类型的 EC2 v CPUs 数。有关每种实例类型的 v CPUs 数的更多信息，请参阅 [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)。

对于每个队列，可指定最多 5 个 Amazon EC2 实例类型。如果您使用[实例集的分配策略](#emr-instance-fleet-allocation-strategy)并使用 AWS CLI 或 Amazon EMR API 创建集群，则每个实例队列最多可以指定 30 个 EC2 实例类型。Amazon EMR 选择这些 EC2 实例类型的任意组合来达到您的目标容量。由于 Amazon EMR 希望完全填满目标容量，因此可能会超过目标。例如，如果存在 2 个未填满的单位，并且 Amazon EMR 只能使用 5 个单位来预置实例，则仍将预置该实例，这意味着将超出目标容量 3 个单位。

如果减少目标容量以调整正在运行的集群的大小，Amazon EMR 会尝试完成应用程序任务并终止实例以满足新目标。有关更多信息，请参阅 [在任务完成时终止](emr-scaledown-behavior.md#emr-scaledown-terminate-task)。

### **启动选项**
<a name="emr-fleet-spot-options"></a>

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

**注意**  
自 2021 年 7 月 1 日起，新客户不再享有具有定义持续时间（也称为 Spot 块）的竞价型实例。对于以前使用过该功能的客户，我们将继续支持具有定义持续时间的竞价型实例，直到 2022 年 12 月 31 日。

在 Amazon EMR 5.12.1 及更高版本中，您可以选择启动采用优化容量分配的竞价型和按需型实例集。此分配策略选项可以在旧版本中设置， AWS 管理控制台 也可以使用 API 进行设置`RunJobFlow`。请注意，您无法在新控制台中自定义分配策略。使用分配策略选项需要额外的服务角色权限。如果您为集群使用默认 Amazon EMR 服务角色和托管式策略（[`EMR_DefaultRole`](emr-iam-role.md) 和 `AmazonEMRServicePolicy_v2`），则已包含分配策略选项的权限。如果您不使用默认 Amazon EMR 服务角色和托管式策略，则必须添加它们以后才能使用此选项。请参阅[Amazon EMR 的服务角色（EMR 角色）](emr-iam-role.md)。

有关竞价型实例的更多信息，请参阅《Amazon EC2 用户指南》中的[竞价型实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances.html)。有关按需型实例的更多信息，请参阅《Amazon EC2 用户指南》中的[按需型实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html)。

如果您选择使用价格最低的分配策略来启动按需型实例集，则可以选择使用容量预留。可以使用 Amazon EMR API `RunJobFlow` 对容量预留选项进行设置。容量预留需要额外的服务角色权限，您必须添加这些权限后才能使用这些选项。请参阅[分配策略权限使用分配策略所需的 IAM 权限](#create-cluster-allocation-policy)。请注意，您无法在新控制台中自定义容量预留。

### **多个子网（可用区）选项**
<a name="emr-multiple-subnet-options"></a>

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

### **主节点（master node）配置**
<a name="emr-master-node-configuration"></a>

由于主实例集只是一个实例，因此其配置与核心实例集和任务实例集的配置略有不同。由于主实例集仅包含一个实例，因此您只能为主实例集选择按需型或竞价型实例。如果您使用控制台创建实例队列，则您选定的购买选项的目标容量将设置为 1。如果使用 AWS CLI，请务必根据`TargetOnDemandCapacity`需要将`TargetSpotCapacity`或设置为 1。您仍然可以为主实例集选择最多 5 个实例类型（为按需型实例或竞价型实例使用分配策略选项时，最多可选择 30 个实例类型）。但与核心实例集和任务实例集（Amazon EMR 可能会预置多个不同类型的实例）不同，Amazon EMR 会为主实例集选择要预置的单个实例类型。

## 实例集的分配策略
<a name="emr-instance-fleet-allocation-strategy"></a>

对于 Amazon EMR 5.12.1 及更高版本，您可以将分配策略选项与每个集群节点的按需型实例和竞价型实例结合使用。当您使用 AWS CLI、Amazon EMR API 或带有分配策略的 Amazon EMR 控制台创建集群时，您可以为每个实例集指定最多 30 个 Amazon EC2 实例类型。使用默认 Amazon EMR 集群实例集配置，每个实例集最多可以有 5 种实例类型。我们建议您使用分配策略选项，它可以加快集群配置、更准确地进行竞价型实例分配并减少竞价型实例中断。

**Topics**
+ [按需型实例的分配策略](#emr-instance-fleet-allocation-strategy-od)
+ [竞价型实例分配策略](#emr-instance-fleet-allocation-strategy-spot)
+ [分配策略权限](#emr-instance-fleet-allocation-strategy-permissions)
+ [使用分配策略所需的 IAM 权限](#create-cluster-allocation-policy)

### 按需型实例的分配策略
<a name="emr-instance-fleet-allocation-strategy-od"></a>

按需型实例可使用以下分配策略：

`lowest-price`**（默认值）**  
最低价格分配策略从具有可用容量的最低价格池中启动按需型实例。如果最低价格池没有可用容量，则按需型实例将来自具有可用容量的次低价格池。

`prioritized`  
通过优先分配策略，您可以为实例集的每种实例类型指定优先级值。Amazon EMR 会启动优先级最高的按需型实例。如果使用此策略，则必须为至少一种实例类型配置优先级。如果没有为实例类型配置优先级值，Amazon EMR 会为该实例类型分配最低优先级。对于给定的实例类型，集群中的每个实例集（主、核心或任务实例集）可具有不同的优先级值。

**注意**  
如果您使用**capacity-optimized-prioritized**竞价分配策略，则在您设置优先级时，Amazon EMR 会将相同的优先级应用于您的按需实例和竞价型实例。

### 竞价型实例分配策略
<a name="emr-instance-fleet-allocation-strategy-spot"></a>

您可以为*竞价型实例*指定以下分配策略之一：

**`price-capacity-optimized`（推荐） **  
价格容量优化的分配策略从竞价型实例池中启动竞价型实例，这些实例池的可用容量最大，启动的实例数量价格最低。因此，价格容量优化策略获得竞价型容量的几率通常更高，中断率也更低。这是 Amazon EMR 6.10.0 及更高版本的默认策略。

**`capacity-optimized`**  
容量优化的分配策略将竞价型实例启动到可用性最高的池中，短期内中断几率最低。对于与重新启动的作业相关的中断成本可能更高的工作负载来说，这是一个不错的选择。这是 Amazon EMR 6.9.0 及更低版本的默认策略。

**`capacity-optimized-prioritized`**  
 capacity-optimized-prioritized分配策略允许您为实例队列中的每种实例类型指定优先级值。Amazon EMR 首先会针对容量进行优化，但会尽量遵循实例类型的优先级，比如优先级不会显著影响实例集预置最佳容量的能力。如果工作负载必须尽量减少中断，但仍需要某些实例类型，我们建议使用此选项。如果使用此策略，则必须为至少一种实例类型配置优先级。如果没有为实例类型配置优先级，Amazon EMR 会为该实例类型分配最低优先级。对于给定的实例类型，集群中的每个实例集（主、核心或任务实例集）可具有不同的优先级值。  
如果使用**优化**按需型分配策略，则在设置优先级时，Amazon EMR 会对按需型实例和竞价型实例应用相同的优先级值。

**`diversified`**  
通过多元化分配策略，Amazon EC2 在所有竞价型容量池中分配竞价型实例。

**`lowest-price`**  
最低价格分配策略从具有可用容量的最低价格池中启动竞价型实例。如果价格最低的池没有可用容量，则竞价型实例将来自价格次低且具有可用容量的池。如果某个池在满足您所需的容量之前耗尽容量，则 Amazon EC2 Fleet 将继续从价格次低的池中提取实例，以满足您的请求。为确保达到所需容量，您可能会获得来自多个容量池的竞价型实例。由于此策略仅考虑实例价格而不考虑容量可用性，因此可能会导致较高的中断率。

### 分配策略权限
<a name="emr-instance-fleet-allocation-strategy-permissions"></a>

使用分配策略选项需要多个 IAM 权限，默认的 Amazon EMR 服务角色和 Amazon EMR 托管式策略（`EMR_DefaultRole` 和 `AmazonEMRServicePolicy_v2`）中会自动提供这些权限。如果您为集群使用自定义服务角色或托管式策略，必须添加这些权限后才能创建集群。有关更多信息，请参阅 [分配策略权限使用分配策略所需的 IAM 权限](#create-cluster-allocation-policy)。

当您使用按需分配策略选项时，可以使用可选的按需容量预留 (ODCRs)。容量预留选项允许您为 Amazon EMR 集群首先使用预留容量指定首选项。您可以使用它来确保您的关键工作负载使用您已经使用开放或定向预留的容量 ODCRs。对于非关键工作负载，容量预留首选项允许您指定是否使用预留容量。

容量预留只能由匹配其属性（实例类型、平台、可用区）的实例使用。默认情况下，Amazon EMR 在配置与实例属性匹配的按需型实例时会自动使用开放容量预留。如果您没有任何正在运行的实例与容量预留的容量匹配，则这些容量将保持未使用的状态，直至启动与其属性相匹配的实例。如果您不想在启动集群时使用任何容量预留，则必须在启动选项中将容量预留首选项设置为 **none (无)**。

不过，您还可以将容量预留定位到特定工作负载。这使您可以明确控制允许哪些实例在预留容量中运行。有关按需容量预留的更多信息，请参阅 [在 Amazon EMR 中将容量预留与实例集结合使用](on-demand-capacity-reservations.md)。

### 使用分配策略所需的 IAM 权限
<a name="create-cluster-allocation-policy"></a>

您的 [Amazon EMR 的服务角色（EMR 角色）](emr-iam-role.md) 需要额外的权限才能创建使用按需型或竞价型实例集的分配策略选项的集群。

我们会自动将这些权限包含在默认 Amazon EMR 服务角色 [`EMR_DefaultRole`](emr-iam-role.md) 和 Amazon EMR 托管策略 [`AmazonEMRServicePolicy_v2`](emr-managed-iam-policies.md) 中。

如果您为集群使用自定义服务角色或托管式策略，则必须添加以下权限：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteLaunchTemplate",
        "ec2:CreateLaunchTemplate",
        "ec2:DescribeLaunchTemplates",
        "ec2:CreateLaunchTemplateVersion",
        "ec2:CreateFleet"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowEC2Deletelaunchtemplate"
    }
  ]
}
```

------

以下是创建使用开放容量或目标容量预留的集群所需的服务角色权限。除了使用分配策略选项所需的权限之外，还必须提供这些权限。

**Example 服务角色容量预留的策略文档**  
要使用开放容量预留，必须提供以下额外权限。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeCapacityReservations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DeleteLaunchTemplateVersions"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowEC2Describecapacityreservations"
    }
  ]
}
```

**Example**  
要使用目标容量预留，必须提供以下额外权限。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeCapacityReservations",
        "ec2:DescribeLaunchTemplateVersions",
        "ec2:DeleteLaunchTemplateVersions",
        "resource-groups:ListGroupResources"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowEC2Describecapacityreservations"
    }
  ]
}
```

## 为您的集群配置实例集
<a name="emr-instance-fleet-console"></a>

------
#### [ Console ]

**使用控制台创建包含实例集的集群**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Cluster configuration**（集群配置）下，选择 **Instance fleets**（实例集）。

1. 对于每个 **Node group**（节点组），选择 **Add instance type**（添加实例类型），为主实例集和核心实例集选择最多 5 个实例类型，为任务实例集选择最多 15 个实例类型。Amazon EMR 可在启动集群时预置这些实例类型的任意组合。

1. 在每个节点组类型下，选择每个实例旁边的 **Actions**（操作）下拉菜单以更改以下设置：  
**添加 EBS 卷**  
在 Amazon EMR 预置实例类型后，指定要附加到实例类型的 EBS 卷。  
**编辑权重容量**  
对于核心节点组，将此值更改为适用于应用程序的任意单位数量。每个实例集实例类型的 YARN vCore 数量用作默认的权重容量单位。您无法编辑主节点的权重容量。  
**编辑最高 Spot 价格**  
为实例集中的每个实例类型指定最高 Spot 价格。您可以采用按需价格的百分比形式或特定美元金额形式设置此价格。如果可用区中的当前 Spot 价格低于最高 Spot 价格，Amazon EMR 会预置竞价型实例。您按 Spot 价格付费，但这不一定是最高 Spot 价格。

1. （可选）要为节点添加安全组，请在 **Networking**（联网）部分展开 **EC2 security groups (firewall)** [EC2 安全组（防火墙）]，然后为每个节点类型选择安全组。

1. 或者，要使用分配策略选项，请选中**应用分配策略**旁边的复选框，然后选择想要为竞价型实例指定的分配策略。如果 Amazon EMR 服务角色没有所需权限，则不应选择此选项。有关更多信息，请参阅 [实例集的分配策略](#emr-instance-fleet-allocation-strategy)。

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

1. 要启动集群，选择 **Create cluster**（创建集群）。

------
#### [ AWS CLI ]

要使用创建和启动带有实例队列的集群 AWS CLI，请遵循以下指南：
+ 要使用实例队列创建和启动集群，请将 `create-cluster` 命令与 `--instance-fleet` 参数结合使用。
+ 要获取有关集群中的实例队列的配置详细信息，请使用 `list-instance-fleets` 命令。
+ 要将多个自定义 Amazon Linux AMIs 添加到您正在创建的集群，请使用每个`InstanceType`规范中的`CustomAmiId`选项。您可以为实例队列节点配置多种实例类型和多种自定义实例类型 AMIs ，以满足您的需求。请参阅[示例：使用实例集配置创建集群](#create-cluster-instance-fleet-cli)。
+ 要更改实例队列的目标容量，请使用 `modify-instance-fleet` 命令。
+ 要向不具有任务实例队列的集群添加此队列，请使用 `add-instance-fleet` 命令。
+  AMIs 可以使用 add-instance-fleet命令中的CustomAmiId 参数将多个自定义添加到任务实例队列中。请参阅[示例：使用实例集配置创建集群](#create-cluster-instance-fleet-cli)。
+ 要在创建实例队列时使用分配策略选项，请更新服务角色以在下一部分内容包含示例策略文档。
+ 要在使用按需分配策略创建实例队列时使用容量预留选项，请更新服务角色以在下一部分内容包含示例策略文档。
+ 默认的 EMR 服务角色和 Amazon EMR 托管式策略（`EMR_DefaultRole` 和 `AmazonEMRServicePolicy_v2`）中将自动提供实例集。如果您为集群使用自定义服务角色或自定义托管式策略，则必须在下一部分内容添加分配策略的新权限。

------

## 示例：使用实例集配置创建集群
<a name="create-cluster-instance-fleet-cli"></a>

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

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

**Example 示例：按需型主实例、带单个实例类型的按需型核心实例、默认 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=m5.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=1,InstanceTypeConfigs=['{InstanceType=m5.xlarge}']
```

**Example 示例：竞价型主实例、带单个实例类型的竞价型核心实例、默认 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=m5.xlarge,BidPrice=0.5}'] \
    InstanceFleetType=CORE,TargetSpotCapacity=1,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,BidPrice=0.5}']
```

**Example 示例：按需型主实例、带单个实例类型的混合核心实例、单个 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=m5.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=2,TargetSpotCapacity=6,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,BidPrice=0.5,WeightedCapacity=2}']
```

**Example 示例：按需型主实例、带多个权重实例类型的竞价型核心实例、竞价型实例的超时、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=m5.xlarge}'] \
    InstanceFleetType=CORE,TargetSpotCapacity=11,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,BidPrice=0.5,WeightedCapacity=3}',\
'{InstanceType=m4.2xlarge,BidPrice=0.9,WeightedCapacity=5}'],\
LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=120,TimeoutAction=SWITCH_TO_ON_DEMAND}'}
```

**Example 示例：按需型主实例、带多个权重实例类型的混合核心实例和任务实例、核心竞价型实例的超时、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=m5.xlarge}'] \
    InstanceFleetType=CORE,TargetOnDemandCapacity=8,TargetSpotCapacity=6,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,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=m5.xlarge,BidPrice=0.5,WeightedCapacity=3}']
```

**Example 示例：竞价型主实例、无核心实例或任务实例、Amazon EBS 配置、默认 VPC**  

```
aws emr create-cluster --release-label Amazon 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=m5.xlarge,BidPrice=0.5,\
EbsConfiguration={EbsOptimized=true,EbsBlockDeviceConfigs=[{VolumeSpecification={VolumeType=gp2,\
SizeIn GB=100}},{VolumeSpecification={VolumeType=io1,SizeInGB=100,Iop s=100},VolumesPerInstance=4}]}}']
```

**Example 示例：多个自定义 AMIs、多种实例类型、按需主实例、按需核心实例**  

```
aws emr create-cluster --release-label Amazon EMR 5.3.1 --service-role EMR_DefaultRole \
  --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \
  --instance-fleets \
    InstanceFleetType=MASTER,TargetOnDemandCapacity=1,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-123456},{InstanceType=m6g.xlarge, CustomAmiId=ami-234567}'] \ 
    InstanceFleetType=CORE,TargetOnDemandCapacity=1,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-123456},{InstanceType=m6g.xlarge, CustomAmiId=ami-234567}']
```

**Example 示例：向具有多种实例类型和多个自定义实例的正在运行的集群添加任务节点 AMIs**  

```
aws emr add-instance-fleet --cluster-id j-123456 --release-label Amazon EMR 5.3.1 \
  --service-role EMR_DefaultRole \
  --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \
  --instance-fleet \
    InstanceFleetType=Task,TargetSpotCapacity=1,\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,CustomAmiId=ami-123456}',\
'{InstanceType=m6g.xlarge,CustomAmiId=ami-234567}']
```

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

```
aws emr create-cluster --release-label emr-5.30.0 --service-role EMR_DefaultRole \
--ec2-attributes InstanceProfile=EMR_EC2_DefaultRole \
--instance-fleets file://my-fleet-config.json
```
该*my-fleet-config.json*文件指定了主实例队列、核心队列和任务实例队列，如以下示例所示。核心实例队列使用最高竞价价格 (`BidPrice`) 作为按需实例的百分比，而任务和主实例队列使用最高竞价价格 (BidPriceAsPercentageofOnDemandPrice) 作为以美元为单位的字符串。  

```
[
    {
        "Name": "Masterfleet",
        "InstanceFleetType": "MASTER",
        "TargetSpotCapacity": 1,
        "LaunchSpecifications": {
            "SpotSpecification": {
                "TimeoutDurationMinutes": 120,
                "TimeoutAction": "SWITCH_TO_ON_DEMAND"
            }
        },
        "InstanceTypeConfigs": [
            {
                "InstanceType": "m5.xlarge",
                "BidPrice": "0.89"
            }
        ]
    },
    {
        "Name": "Corefleet",
        "InstanceFleetType": "CORE",
        "TargetSpotCapacity": 1,
        "TargetOnDemandCapacity": 1,
        "LaunchSpecifications": {
          "OnDemandSpecification": {
            "AllocationStrategy": "lowest-price",
            "CapacityReservationOptions": 
            {
                "UsageStrategy": "use-capacity-reservations-first",
                "CapacityReservationResourceGroupArn": "String"
            }
        },
            "SpotSpecification": {
                "AllocationStrategy": "capacity-optimized",
                "TimeoutDurationMinutes": 120,
                "TimeoutAction": "TERMINATE_CLUSTER"
            }
        },
        "InstanceTypeConfigs": [
            {
                "InstanceType": "m5.xlarge",
                "BidPriceAsPercentageOfOnDemandPrice": 100
            }
        ]
    },
    {
        "Name": "Taskfleet",
        "InstanceFleetType": "TASK",
        "TargetSpotCapacity": 1,
        "LaunchSpecifications": {
          "OnDemandSpecification": {
            "AllocationStrategy": "lowest-price",
            "CapacityReservationOptions": 
            {
                "CapacityReservationPreference": "none"
            }
        },
            "SpotSpecification": {
                "TimeoutDurationMinutes": 120,
                "TimeoutAction": "TERMINATE_CLUSTER"
            }
        },
        "InstanceTypeConfigs": [
            {
                "InstanceType": "m5.xlarge",
                "BidPrice": "0.89"
            }
        ]
    }
]
```

## 修改实例集的目标容量
<a name="emr-fleet-modify-target-cli"></a>

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

```
aws emr modify-instance-fleet --cluster-id <cluster-id> \
  --instance-fleet \
    InstanceFleetId='<instance-fleet-id>',TargetOnDemandCapacity=1,TargetSpotCapacity=1
```

## 将任务实例集添加到集群
<a name="emr-task-instance-fleet"></a>

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

```
aws emr add-instance-fleet --cluster-id <cluster-id> 
  --instance-fleet \
    InstanceFleetType=TASK,TargetSpotCapacity=1,\
LaunchSpecifications={SpotSpecification='{TimeoutDurationMinutes=20,TimeoutAction=TERMINATE_CLUSTER}'},\
InstanceTypeConfigs=['{InstanceType=m5.xlarge,BidPrice=0.5}']
```

## 获取集群中的实例集的配置详细信息
<a name="emr-instance-fleet-get-configuration"></a>

使用 `list-instance-fleets` 命令可获取集群中的实例队列的配置详细信息。该命令将集群 ID 用作输入。以下示例演示了针对包含主任务实例组和核心任务实例组的集群的命令及其输出。有关完整的响应语法，请参阅[ListInstanceFleets](https://docs.aws.amazon.com/ElasticMapReduce/latest/API/API_ListInstanceFleets.html)《*Amazon EMR API* 参考》。

```
list-instance-fleets --cluster-id <cluster-id>			
```

```
{
    "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": "m5.xlarge",
                    "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": "m5.xlarge",
                    "WeightedCapacity": 1
                }
            ],
           "Id": "if-2ABC4DEFGHIJ4"
        }
    ]
}
```

# 重新配置 Amazon EMR 集群的实例集
<a name="instance-fleet-reconfiguration"></a>

对于 Amazon EMR 5.21.0 和更高版本，您可以重新配置集群应用程序，并为运行的集群中的每个实例集指定额外的配置分类。为此，您可以使用 AWS 命令行界面 (AWS CLI) 或 AWS SDK。

您可以通过查看 CloudWatch 事件来跟踪实例队列的状态。有关更多信息，请参阅[实例集重新配置事件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html#emr-cloudwatch-instance-fleet-events-reconfig)。

**注意**  
您只能覆盖在集群创建期间指定的集群 Configurations 对象。有关配置对象的更多信息，请参阅[RunJobFlow 请求语法](https://docs.aws.amazon.com/emr/latest/APIReference/API_RunJobFlow.html#API_RunJobFlow_RequestSyntax)。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会将手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例集的集群默认设置。

当您使用 Amazon EMR 控制台、 AWS 命令行界面AWS CLI() 或 AWS 软件开发工具包提交重新配置请求时，Amazon EMR 会检查现有的集群配置文件。如果现有配置与您提供的文件之间存在差异，Amazon EMR 会启动重新配置操作，重新启动某些应用程序，并将任何手动修改的配置（例如您在使用 SSH 连接到集群时修改的配置）重置为指定实例集的集群默认设置。

## 重新配置行为
<a name="instance-fleet-reconfiguration-behaviors"></a>

重新配置会使用新提交的配置集来覆盖集群上的配置，并且可以覆盖在重新配置 API 之外进行的配置更改。

Amazon EMR 执行滚动过程来重新配置任务和核心实例集中的实例。每次只会修改和重启特定实例类型的一部分实例。如果您的实例集有多种不同的实例类型配置，它们将并行重新配置。

重新配置是在[InstanceTypeConfig](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceTypeConfig.html)级别上声明的。有关视觉示例，请参阅[重新配置实例集](#instance-fleet-reconfiguration-cli-sdk)。您可以在单个请求中提交包含一个或多个实例类型的更新配置设置的重新配置请求。您必须在修改请求中包括您的实例集中的所有实例类型；但是，配置字段已填充的实例类型将进行重新配置，而实例集中的其他 `InstanceTypeConfig` 实例保持不变。只有当指定实例类型的所有实例都完成重新配置时，重新配置才被视为成功。如果任何实例重新配置失败，则整个实例集将自动恢复到其上次已知的稳定配置。

## 限制
<a name="instance-fleet-reconfiguration-limitations"></a>

在重新配置正在运行的集群中的实例集时，请考虑以下限制：
+ 尤其是在应用程序未正确配置时，非 YARN 应用程序可能会在重新启动期间失败或导致集群问题。接近最大内存和 CPU 使用率的集群可能会在重新启动过程后遇到问题。对于主实例集而言，情况尤其如此。请参阅[排查实例集重新配置问题](#instance-fleet-reconfiguration-troubleshooting)部分。
+ 调整大小和重新配置操作不会并行进行。重新配置请求将等待正在进行的调整大小，反之亦然。
+ 调整大小和重新配置操作不会并行进行。重新配置请求将等待正在进行的调整大小，反之亦然。
+ 在重新配置实例集后，Amazon EMR 将重新启动应用程序，从而使新配置生效。如果在重新配置期间正在使用应用程序，则可能会出现作业失败或其它意外应用程序行为。
+ 如果某实例集下任何实例类型配置的重新配置失败，Amazon EMR 会将整个实例集的配置参数恢复为以前的有效版本，同时发出事件并更新状态详细信息。如果恢复过程也失败，您必须提交新的 `ModifyInstanceFleet` 请求以从 `ARRESTED` 状态恢复实例集。恢复失败会导致[实例集重新配置事件](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-manage-cloudwatch-events.html#emr-cloudwatch-instance-fleet-events-reconfig)和状态更改。
+ 仅在 Amazon EMR 5.23.0 和更高版本中支持 Phoenix 配置分类的重新配置请求，在 Amazon EMR 5.21.0 或 5.22.0 版本中不支持该请求。
+ 只有亚马逊 EMR 版本 5.30.0 及更高版本支持 HBase 配置分类的重新配置请求，亚马逊 EMR 版本 5.23.0 到 5.29.0 不支持重新配置请求。
+ 具有多个主节点的 Amazon EMR 集群上不支持重新配置 hdfs-encryption-zones 分类或任何 Hadoop KMS 配置分类。
+ Amazon EMR 目前不支持某些需要重新启动 YARN 的 YARN 容量调度程序的重新配置请求。 ResourceManager例如，您无法完全删除队列。
+ 当 YARN 需要重启时，所有正在运行的 YARN 作业通常会终止并丢失。这可能会导致数据处理延迟。要在 YARN 重启期间运行 YARN 作业，您可以创建一个具有多个主节点的 Amazon EMR 集群，或者在 yarn-site 配置分类中将 yarn.resourcemanager.recovery.enabled 设置为 `true`。有关使用多个主节点的更多信息，请参阅[高可用性 YARN ResourceManager](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-ha-applications.html#emr-plan-ha-applications-YARN)。

## 重新配置实例集
<a name="instance-fleet-reconfiguration-cli-sdk"></a>

------
#### [ Using the AWS CLI ]

使用 `modify-instance-fleet` 命令为正在运行的集群中的一个实例集指定新配置。

**注意**  
在以下示例中，将 **j-2 AL4 XXXXXX5 T9** 替换为您的集群 ID，将 i **f-1xxxxxxx** 9 替换为您的实例队列 ID。

**示例：替换实例集的配置**

**警告**  
指定您在启动时使用的所有 `InstanceTypeConfig` 字段。不包括字段可能会导致覆盖您在启动时声明的规范。有关列表 [InstanceTypeConfig](https://docs.aws.amazon.com/emr/latest/APIReference/API_InstanceTypeConfig.html)，请参阅。

以下示例引用了一个名为 instanceFleet.json 的配置 JSON 文件，用于编辑实例队列的 YARN NodeManager 磁盘运行状况检查器的属性。

**实例集修改 JSON**

1. 准备配置分类，并在运行命令的相同目录中将其保存为 instanceFleet.json。

   ```
   {
       "InstanceFleetId":"if-1xxxxxxx9",
       "InstanceTypeConfigs": [
               {
                   "InstanceType": "m5.xlarge",
                  other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"true",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"100.0"
                           }
                       }
                   ]
               },
               {
                   "InstanceType": "r5.xlarge",
                  other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"false",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"70.0"
                           }
                       }
                   ]
               }
           ]
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-fleet \
   --cluster-id j-2AL4XXXXXX5T9 \
   --region us-west-2 \
   --instance-fleet instanceFleet.json
   ```

**示例：向实例集添加配置**

如果要向实例类型添加配置，还必须在新的 `ModifyInstanceFleet` 请求中包含以前为实例集指定的配置。否则，将删除以前指定的配置。

以下示例为 YARN NodeManager 虚拟内存检查器添加了一个属性。该配置还包括之前为 YARN NodeManager 磁盘运行状况检查器指定的值，因此这些值不会被覆盖。

1. 在 instanceFleet.json 中准备以下内容，并将其保存在您将运行命令的同一目录中。

   ```
   {
       "InstanceFleetId":"if-1xxxxxxx9",
       "InstanceTypeConfigs": [
               {
                   "InstanceType": "m5.xlarge",
                   other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"true",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"100.0",
                               "yarn.nodemanager.vmem-check-enabled":"true",
                               "yarn.nodemanager.vmem-pmem-ratio":"3.0"
                           }
                       }
                   ]
               },
               {
                   "InstanceType": "r5.xlarge",
                   other InstanceTypeConfig fields
                   "Configurations": [
                       {
                           "Classification": "yarn-site",
                           "Properties": {
                               "yarn.nodemanager.disk-health-checker.enable":"false",
                               "yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage":"70.0"
                           }
                       }
                   ]
               }
           ]      
   }
   ```

1. 运行如下命令。

   ```
   aws emr modify-instance-fleet \
   --cluster-id j-2AL4XXXXXX5T9 \
   --region us-west-2 \
   --instance-fleet instanceFleet.json
   ```

------
#### [ using the Java SDK ]

**注意**  
在以下示例中，将 **j-2 AL4 XXXXXX5 T9** 替换为您的集群 ID，将 i **f-1xxxxxxx** 9 替换为您的实例队列 ID。

以下代码段使用适用于 Java 的 AWS SDK 为实例队列提供了新的配置。

```
AWSCredentials credentials = new BasicAWSCredentials("access-key", "secret-key");
AmazonElasticMapReduce emr = new AmazonElasticMapReduceClient(credentials);

Map<String,String> hiveProperties = new HashMap<String,String>();
hiveProperties.put("hive.join.emit.interval","1000");
hiveProperties.put("hive.merge.mapfiles","true");
        
Configuration newConfiguration = new Configuration()
    .withClassification("hive-site")
    .withProperties(hiveProperties);
    
List<InstanceTypeConfig> instanceTypeConfigList = new ArrayList<>();

for (InstanceTypeConfig instanceTypeConfig : currentInstanceTypeConfigList) {
    instanceTypeConfigList.add(new InstanceTypeConfig()
        .withInstanceType(instanceTypeConfig.getInstanceType())
        .withBidPrice(instanceTypeConfig.getBidPrice())
        .withWeightedCapacity(instanceTypeConfig.getWeightedCapacity())
        .withConfigurations(newConfiguration)
    );
}

InstanceFleetModifyConfig instanceFleetModifyConfig = new InstanceFleetModifyConfig()
    .withInstanceFleetId("if-1xxxxxxx9")
    .withInstanceTypeConfigs(instanceTypeConfigList);
    
ModifyInstanceFleetRequest modifyInstanceFleetRequest = new ModifyInstanceFleetRequest()
    .withInstanceFleet(instanceFleetModifyConfig)
    .withClusterId("j-2AL4XXXXXX5T9");

emrClient.modifyInstanceFleet(modifyInstanceFleetRequest);
```

------

## 排查实例集重新配置问题
<a name="instance-fleet-reconfiguration-troubleshooting"></a>

如果实例队列中任何实例类型的重新配置过程失败，Amazon EMR 会恢复正在进行的重新配置，并使用事件事件记录失败消息。 AAmazon CloudWatch 此事件能够提供该重新配置失败的简短摘要。其会列出重新配置失败的实例以及相应的失败消息。下面是一个失败消息示例。

`Amazon EMR couldn't revert the instance fleet if-1xxxxxxx9 in the Amazon EMR cluster j-2AL4XXXXXX5T9 (ExampleClusterName) to the previously successful configuration at 2021-01-01 00:00 UTC. The reconfiguration reversion failed because of Instance i-xxxxxxx1, i-xxxxxxx2, i-xxxxxxx3 failed with message "This is an example failure message"...`

### 访问节点预置日志
<a name="instance-fleet-reconfiguration-troubleshooting-connect-node"></a>

使用 SSH 连接到重新配置失败的节点。有关说明，请参阅 *Amazon Elastic Compute Cloud* 中的[连接到您的 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

------
#### [ Accessing logs by connecting to a node ]

1. 导航到以下包含节点预置日志文件的目录。

   ```
   /mnt/var/log/provision-node/
   ```

1. 打开报告子目录并搜索节点预置报告，从而进行重新配置。报告目录根据重新配置版本号、通用唯一标识符 (UUID)、Amazon EC2 实例 IP 地址和时间戳来组织日志。每个报告都是一个压缩的 YAML 文件，其中包含有关重新配置过程的详细信息。以下为报告文件名和路径的示例。

   ```
   /reports/2/ca598xxx-cxxx-4xxx-bxxx-6dbxxxxxxxxx/ip-10-73-xxx-xxx.ec2.internal/202104061715.yaml.gz
   ```

1. 您可以使用文件查看器（如以下示例中的 zless）来查看报告。

   ```
   zless 202104061715.yaml.gz
   ```

------
#### [ Accessing logs using Amazon S3 ]

登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。打开您在配置集群时指定的 Amazon S3 存储桶，以便将日志文件存档。

1.  导航到以下包含节点预配置日志文件的文件夹：

   ```
   amzn-s3-demo-bucket/elasticmapreduce/cluster id/node/instance id/provision-node/
   ```

1. 打开报告文件夹并搜索节点预置报告，从而进行重新配置。报告文件夹根据重新配置版本号、通用唯一标识符 (UUID)、Amazon EC2 实例 IP 地址和时间戳来组织日志。每个报告都是一个压缩的 YAML 文件，其中包含有关重新配置过程的详细信息。以下为报告文件名和路径的示例。

   ```
   /reports/2/ca598xxx-cxxx-4xxx-bxxx-6dbxxxxxxxxx/ip-10-73-xxx-xxx.ec2.internal/202104061715.yaml.gz
   ```

要查看日志文件，您可以将其作为文本文件从 Amazon S3 下载到本地计算机。有关说明，请参阅[下载对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html)。

------

每个日志文件都包含关联重新配置的详细预配置报告。要查找错误消息信息，您可以搜索报告的 `err` 日志级别。报告格式取决于集群上的 Amazon EMR 版本。以下示例显示了 Amazon EMR 5.32.0 和 6.2.0 及更高版本使用以下格式的错误消息：

```
- level: err
  message: 'Example detailed error message.'
  source: Puppet
  tags:
  - err
  time: '2021-01-01 00:00:00.000000 +00:00'
  file: 
  line:
```

# 在 Amazon EMR 中将容量预留与实例集结合使用
<a name="on-demand-capacity-reservations"></a>

要启动带有容量预留选项的按需型实例集，请附加使用容量预留选项所需的额外服务角色权限。由于容量预留选项必须与按需分配策略一起使用，因此您还必须在服务角色和托管式策略中提供分配策略所需的权限。有关更多信息，请参阅[分配策略权限使用分配策略所需的 IAM 权限](emr-instance-fleet.md#create-cluster-allocation-policy)。

Amazon EMR 支持开放容量预留和目标容量预留。以下主题显示了可与 `RunJobFlow` 操作或 `create-cluster` 命令结合使用的实例集配置，以还使用按需型容量预留启动实例集。

## 尽力使用开放容量预留
<a name="on-demand-capacity-reservations-best-effort"></a>

如果集群的按需型实例与您账户中可用的开放容量预留属性（实例类型、平台、租赁和可用区）相匹配，则会自动应用容量预留。但是，不能保证使用您的容量预留。为了预置集群，Amazon EMR 评估启动请求中指定的所有实例池，并使用价格最低且具有足够容量的实例池来启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配，它们将保持未使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中的实例池中，首先从价格最低的节点开始，直到预置完所有任务节点。将自动应用与实例池匹配的可用开放容量预留。

以下是尽力使用开放容量预留 Amazon EMR 容量分配逻辑的使用案例。

**示例 1: 启动请求中价格最低的实例池具有可用的开放容量预留**

在这种情况下，Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。将自动使用此实例池中可用的开放容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | 150 | 100 | 100 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | 100 | - | - | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | 50 | 100 | 100 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**示例 2: 启动请求中价格最低的实例池没有可用的开放容量预留**

在这种情况下，Amazon EMR 在具有按需型实例的价格最低的实例池中启动容量。但是，您的开放容量预留仍处于未使用状态。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
|  可用的开放容量预留  | - | - | 100 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 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。

## 首先使用开放容量预留
<a name="on-demand-capacity-reservations-first"></a>

在预置 Amazon EMR 集群时，您可以选择覆盖价格最低的分配策略，并将首先使用可用的开放容量预留作为首要优先级。在这种情况下，Amazon EMR 会评估在启动请求中指定容量预留的所有实例池，并使用具有足够容量且价格最低的实例池来启动所有请求的核心节点。如果具有容量预留的实例池没有足够容量用于请求的核心节点，Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说，Amazon EMR 会重新评估启动请求中指定的所有实例池，并使用价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。如果可用的开放容量预留与实例池不匹配，它们将保持未使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有容量预留的实例池中，首先从价格最低的实例池开始，直到预置完所有任务节点。Amazon EMR 首先使用选定可用区中每个实例池中可用的开放容量预留，并且仅在需要时使用价格最低的策略来预置所有剩余的任务节点。

以下是首先使用开放容量预留的 Amazon EMR 容量分配逻辑的使用案例。

**示例 1：**启动请求中具有可用开放容量预留的实例池具有足够的核心节点容量****

在这种情况下，Amazon EMR 在具有可用开放容量预留的实例池中启动容量，而不考虑实例池价格。因此，会在预置所有核心节点之前，尽可能使用您的开放容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | - | - | 150 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | - | - | 100 | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | - | - | 100 | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | - | - | 50 | 
| --- |--- |--- |--- |

**示例 2：**启动请求中具有可用开放容量预留的实例池没有足够的容量用于核心节点****

在这种情况下，Amazon EMR 回退到使用价格最低的策略启动核心节点，并尽力使用容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的开放容量预留 | 10 | 50 | 50 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的开放容量预留 | 10 | - | - | 
| --- |--- |--- |--- |
| 可用的开放容量预留 | - | 50 | 50 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**将实例机群配置为首先使用开放容量预留**

使用 `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。

## 首先使用目标容量预留
<a name="on-demand-capacity-reservations-targeted"></a>

预置 Amazon EMR 集群时，您可以选择覆盖价格最低的分配策略，并将首先使用可用的目标容量预留作为首要优先级。在这种情况下，Amazon EMR 会评估在启动请求中指定目标预留的所有实例池，并选择具有足够容量的价格最低的实例池来启动所有请求的核心节点。如果具有目标容量预留的实例池没有足够容量用于请求的核心节点，Amazon EMR 会回退到上一主题中描述的尽力案例。也就是说，Amazon EMR 会重新评估启动请求中指定的所有实例池，并选择价格最低且具有足够容量的实例池启动所有请求的核心节点。将自动应用与实例池匹配的可用开放容量预留。但是，目标容量预留仍处于使用状态。

预置核心节点后，就会选择并修复可用区。Amazon EMR 将任务节点预置到选定可用区中具有目标容量预留的实例池中，首先从价格最低的实例池开始，直到预置完所有任务节点。Amazon EMR 首先尝试使用选定可用区中每个实例池中可用的目标容量预留。然后，Amazon EMR 仅在需要时使用价格最低的策略来预置所有剩余的任务节点。

以下是首先使用目标容量预留的 Amazon EMR 容量分配逻辑的使用案例。

**示例 1: 启动请求中具有可用目标容量预留的实例池具有足够的核心节点容量**

在这种情况下，Amazon EMR 在具有可用目标容量预留的实例池中启动容量，而不考虑实例池价格。因此，会在预置所有核心节点之前，尽可能使用您的目标容量预留。


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 使用策略 | use-capacity-reservations-first | 
| 请求的容量 | 100 | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的目标容量预留 | - | - | 150 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | - | - | 100 | 
| --- |--- |--- |--- |
| 已使用的目标容量预留 | - | - | 100 | 
| --- |--- |--- |--- |
| 可用的目标容量预留 | - | - | 50 | 
| --- |--- |--- |--- |

**Example 示例 2：启动请求中具有可用目标容量预留的实例池没有足够的容量用于核心节点**  


|  |  | 
| --- |--- |
| 按需策略 | lowest-price | 
| 请求的容量 | 100 | 
| 使用策略 | use-capacity-reservations-first | 
| 实例类型 | c5.xlarge | m5.xlarge | r5.xlarge | 
| 可用的目标容量预留 | 10 | 50 | 50 | 
| 按需价格 | \$1 | \$1\$1 | \$1\$1\$1 | 
| 预置的实例 | 100 | - | - | 
| --- |--- |--- |--- |
| 已使用的目标容量预留 | 10 | - | - | 
| --- |--- |--- |--- |
| 可用的目标容量预留 | - | 50 | 50 | 
| --- |--- |--- |--- |

在启动队列后，您可以运行 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-capacity-reservations.html) 来查看剩余的未使用的容量预留量。

**将实例机群配置为首先使用目标容量预留**

使用 `RunJobFlow` 操作创建基于实例集的集群时，请将按需分配策略设置为 `lowest-price`，并将 `CapacityReservationOptions` 的 `UsageStrategy` 设置为 `use-capacity-reservations-first`、将 `CapacityReservationOptions` 的 `CapacityReservationResourceGroupArn` 设置为 `<your resource group ARN>`。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[使用容量预留](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-using.html)。

```
"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。

## 避免使用可用的开放容量预留
<a name="on-demand-capacity-reservations-avoiding"></a>

**Example**  
如果您希望避免在启动 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。

## 使用容量预留的方案
<a name="on-demand-capacity-reservations-scenarios"></a>

在以下情况下，使用容量预留可以获得益处。

**情况 1：使用容量预留轮替长时间运行的集群**  
在轮替一个长时间运行的集群时，您可能对预置新实例的实例类型和可用区有严格的要求。通过容量预留，您可以使用容量保证来完成集群轮替，且不会发生中断。

![\[使用可用容量预留的集群轮替\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/odcr-longrunning-cluster-diagram.png)


**方案 2：使用容量预留预置连续的短期集群**  
您还可以使用容量预留为单个工作负载配置一组连续的短期集群，以便在终止集群时，下一个集群可以使用容量预留。您可以使用目标容量预留来确保仅预期集群使用容量预留。

![\[使用可用容量预留的短期集群预置\]](http://docs.aws.amazon.com/zh_cn/emr/latest/ManagementGuide/images/odcr-short-cluster-diagram.png)


# 为 Amazon EMR 集群配置统一实例组
<a name="emr-uniform-instance-group"></a>

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

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

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

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

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

## 使用控制台配置统一实例组
<a name="emr-uniform-instance-group-console"></a>

------
#### [ Console ]

**使用新控制台通过实例组创建集群**

1. [登录 AWS 管理控制台，然后在 /emr 上打开亚马逊 EMR 控制台。https://console.aws.amazon.com](https://console.aws.amazon.com/emr)

1. 在左侧导航窗格中的 **EMR on EC2** 下，选择 **Clusters**（集群），然后选择 **Create cluster**（创建集群）。

1. 在 **Cluster configuration**（集群配置）下，选择 **Instance groups**（实例组）。

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

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

1. 在每个节点组类型下，选择每个实例旁边的 **Actions**（操作）下拉菜单以更改以下设置：  
**添加 EBS 卷**  
在 Amazon EMR 预置实例类型后，指定要附加到实例类型的 EBS 卷。  
**编辑最高 Spot 价格**  
为实例集中的每个实例类型指定最高 Spot 价格。您可以采用按需价格的百分比形式或特定美元金额形式设置此价格。如果可用区中的当前 Spot 价格低于最高 Spot 价格，Amazon EMR 会预置竞价型实例。您按 Spot 价格付费，但这不一定是最高 Spot 价格。

1. 或者，扩展**节点配置**以输入 JSON 配置或从 Amazon S3 加载 JSON。

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

1. 要启动集群，选择 **Create cluster**（创建集群）。

------

## 使用创建具有统一实例组的集群 AWS CLI
<a name="emr-uniform-instance-group-cli"></a>

要使用 AWS CLI指定集群的实例组配置，请将 `create-cluster` 命令与 `--instance-groups` 参数结合使用。除非您为实例组指定 `BidPrice` 实参，否则 Amazon EMR 将使用按需型实例选项。有关使用按需实例和各种集群选项启动统一实例组的 `create-cluster` 命令的示例，请在命令行上键入 `aws emr create-cluster help `，或参阅《AWS CLI 命令参考》**中的 [create-cluster](https://docs.aws.amazon.com/cli/latest/reference/emr/create-cluster.html)。

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

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

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

```
aws emr create-cluster --name "MySpotCluster" \
  --release-label emr-7.12.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\$164 架构自定义 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 创建实例组
<a name="emr-instance-group-sdk"></a>

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

```
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");
```

# Amazon EMR 集群的可用区灵活性
<a name="emr-flexibility"></a>

每个 AWS 区域 都有多个被称为可用区的隔离位置。当您启动实例时，可以选择指定您所用 AWS 区域 中的可用区（AZ）。[可用区灵活性](#emr-flexibility-az)是指实例在多个可用区之间分布 AZs。如果一个实例发生故障，您可以设计您的应用程序，使另一个可用区中的实例可以处理请求。有关可用区的更多信息，请参阅《Amazon EC2 用户指南**》中的[区域和可用区](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones)文档。

[实例灵活性](#emr-flexibility-types)是指使用多种实例类型来满足容量要求。使用实例表现灵活性时，可以跨实例大小、系列和代系使用总容量。与使用单一实例类型的集群相比，更大的灵活性有助于提高查找和分配所需计算容量的能力。

与具有单一实例类型或可用区的集群相比，实例和可用区灵活性能够减少[容量不足错误（ICE）](emr-events-response-insuff-capacity.md)和竞价型中断。在了解初始实例系列和大小后，请使用此处介绍的最佳实践来确定需要实现多样化的实例。这种方法可实现最低的性能和成本差异，同时最大限度提高 Amazon EC2 容量池的可用性。

## 灵活选择可用区
<a name="emr-flexibility-az"></a>

建议配置所有可用区以在虚拟私有云（VPC）中使用，并为 EMR 集群选择这些可用区。集群必须仅存在于一个可用区中，但通过 Amazon EMR 实例集，您可以为不同的可用区选择多个子网。当 Amazon EMR 启动集群时，它会在这些子网中查找您指定的实例和购买选项。当您为多个子网配置 EMR 集群时，与单个子网中的集群相比，您的集群可以访问更充足的 Amazon EC2 容量池。

如果您必须优先考虑一定数量的可用区，以便在 EMR 集群的虚拟私有云（VPC）中使用，则可以利用 Amazon EC2 的竞价型放置分数功能。使用竞价放置评分，您可以指定竞价型实例的计算要求，然后 EC2 会按照 1 到 10 的等级返回得分排名前十 AWS 区域 的可用区。分数为 10 表示您的竞价型请求成功的可能性很大；分数为 1 表示您的竞价型请求不太可能成功。有关如何使用竞价型放置分数的更多信息，请参阅《Amazon EC2 用户指南》**中的[竞价型放置分数](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html)。

## 灵活选择实例类型
<a name="emr-flexibility-types"></a>

实例灵活性是指使用多种实例类型来满足容量要求。实例灵活性有利于 Amazon EC2 竞价型实例和按需型实例的使用。借助竞价型实例，实例灵活性允许 Amazon EC2 使用实时容量数据从更充足的容量池启动实例。此外，实例灵活性还可以预测哪些实例的可用性最高，从而减少中断并降低工作负载的整体成本。借助按需型实例，当在更多的实例池中配置总容量时，实例灵活性可减少容量不足错误（ICE）。

对于 **Instance Group**（实例组）集群，最多可指定 50 个 EC2 实例类型。对于具有分配策略的 **Instance Fleets**（实例集），每个主节点组、核心节点组和任务节点组最多可指定 30 个 EC2 实例类型。实例范围越大，实例灵活性的优势就越多。

### 表现实例灵活性
<a name="emr-flexibility-express"></a>

请考虑以下最佳实践来表现应用程序的实例灵活性。

**Topics**
+ [确定实例系列和大小](#emr-flexibility-express-size)
+ [包含其他实例](#emr-flexibility-express-include)

#### 确定实例系列和大小
<a name="emr-flexibility-express-size"></a>

Amazon EMR 支持针对不同用例的多个实例类型。[Amazon EMR 支持的实例类型](emr-supported-instance-types.md) 文档中列出了这些实例类型。每个实例类型都属于一个实例系列，该系列描述了该类型针对哪些应用程序进行了优化。

对于新的工作负载，应该使用通用系列中的实例类型进行基准测试，例如 `m5` 或 `c5`。然后，从 Ganglia 和 Amazon CloudWatch 监控操作系统和 YARN 指标，以确定负载达到峰值时的系统瓶颈。瓶颈包括 CPU、内存、存储和 I/O 操作。确定瓶颈后，为实例类型选择计算优化、内存优化、存储优化或其他合适的实例系列。有关更多详细信息，请参阅 Amazon EMR 最佳实践指南中的 “[为你的 Spark 工作负载确定合适的基础架构](https://github.com/aws/aws-emr-best-practices/blob/main/website/docs/bestpractices/Applications/Spark/best_practices.md#bp-512-----determine-right-infrastructure-for-your-spark-workloads)” 页面。 GitHub

接下来，确定应用程序需要的最小 YARN 容器或 Spark 执行程序。这是适合容器的最小实例大小，也是集群的最小实例大小。使用此指标来确定可进一步实现多元化的实例。实例越小，实例灵活性就越高。

为了获得最大的实例灵活性，您应该利用尽可能多的实例。建议使用硬件规格相似的实例实现多元化。这可以最大限度地访问 EC2 容量池，同时将成本和性能差异降至最低。实现不同大小实例的多元化。为此，首先要确定 AWS Graviton 和上一代实例的优先级。一般来说，对于每种工作负载，应在至少 15 种实例类型之间进行灵活选择。建议从通用型实例、计算优化型实例或内存优化型实例开始。这些实例类型的灵活性最大。

#### 包含其他实例
<a name="emr-flexibility-express-include"></a>

包含其他实例类型，以便最大限度地实现多元化。首先确定实例大小、Graviton 和代系灵活性的优先级。这将允许访问其他具有类似成本和性能配置的 EC2 容量池。如果由于 ICE 或竞价型实例中断而需要提高灵活性，请考虑变体和系列灵活性。每种方法都需要根据您的使用案例和要求进行权衡。
+ **大小灵活性**：首先，使用同系列不同大小的实例实现多元化。尽管同系列的实例成本和性能相同，但可以在每台主机上启动不同数量的容器。例如，如果所需的最小执行程序大小为 2vCPU 和 8Gb 内存，则最小实例大小为 `m5.xlarge`。为实现大小灵活性，请将 `m5.xlarge`、`m5.2xlarge`、`m5.4xlarge`、`m5.8xlarge`、`m5.12xlarge`、`m5.16xlarge` 和 `m5.24xlarge` 包含在内。
+ **Graviton 灵活性**：除大小外，您还可以通过 Graviton 实例实现多元化。Graviton 实例由 G AWS raviton2 处理器提供支持，可为亚马逊 EC2 中的云工作负载提供最佳的性价比。例如，如果最小实例大小为 `m5.xlarge`，则可将 `m6g.xlarge`、`m6g.2xlarge`、`m6g.4xlarge`、`m6g.8xlarge` 和 `m6g.16xlarge` 包含在内，以确保实现 Graviton 的灵活性。
+ **代系灵活性**：与 Graviton 和大小灵活性类似，上一代系列中的实例具有相同的硬件规格。因此，成本和性能配置相似，同时增加了可访问的 Amazon EC2 池总量。为确保代系灵活性，请将 `m4.xlarge`、`m4.2xlarge`、`m4.10xlarge` 和 `m4.16xlarge` 包含在内。
+ **系列和变体灵活性**
  + **容量**：为了优化容量，建议在实例系列中灵活使用实例。来自不同实例系列的通用实例的实例池更充足，有助于满足容量要求。但是，实例系列不同，vCPU 与内存比率也有所不同。如果预期的应用程序容器大小适合不同的实例，会导致利用不足。例如，对于 `m5.xlarge`，可将计算优化型实例（如 `c5`）或内存优化型实例（如 `r5`）包含在内，以确保实例系列灵活性。
  + **成本**：为了优化成本，我们建议在不同变体之间灵活使用实例。这些实例的内存与 vCPU 比率与初始实例相同。变体灵活性的劣势在于，这些实例的容量池较小，可能导致额外容量受限或竞价型实例中断增加。例如对于 `m5.xlarge`，可将基于 AMD 的实例 (`m5a`)、基于 SSD 的实例 (`m5d`) 或网络优化实例 (`m5n`) 包含在内，以实现变体灵活性。

# 为竞价型实例配置 Amazon EMR 集群实例类型和最佳实践
<a name="emr-plan-instances-guidelines"></a>

使用此部分中的准则可帮助您决定要为 EMR 集群中的每个节点类型预置的实例类型、购买选项和存储量。

## 您应使用哪个实例类型？
<a name="emr-instance-group-size"></a>

可通过多种方式将 Amazon EC2 实例添加到集群。选取何种方式取决于您对集群使用实例组配置还是实例集配置。
+ **实例组**
  + 手动将同一类型的实例添加到现有的核心和任务实例组。
  + 手动添加任务实例组，该组可使用其它实例类型。
  + 在 Amazon EMR 中为实例组设置自动扩展，根据您指定的亚马逊 CloudWatch 指标值自动添加和删除实例。有关更多信息，请参阅 [使用 Amazon EMR 集群扩展来适应不断变化的工作负载](emr-scale-on-demand.md)。
+ **实例队列**
  + 添加一个任务实例队列。
  + 对于现有的核心和任务实例队列，更改按需实例和竞价型实例的目标容量。有关更多信息，请参阅[规划和配置 Amazon EMR 集群的实例集](emr-instance-fleet.md)。

规划集群实例的一个方法是，使用代表性的示例数据集运行测试集群并监控集群中节点的利用。有关更多信息，请参阅[在 Amazon EMR 集群执行工作时查看和监控](emr-manage-view.md)。另一种方法是计算您在考虑的实例的容量，并将该容量值与数据的大小做比较。

通常，分配任务的主节点类型不需要 EC2 实例和很高的处理能力；核心节点类型的 Amazon EC2 实例（处理任务并将数据存储在 HDFS 中）需要处理能力和存储容量；任务节点类型的 Amazon EC2 实例（不存储数据）只需要处理能力。有关可用的 Amazon EC2 实例及其配置的准则，请参阅[配置 Amazon EC2 实例类型以用于 Amazon EMR](emr-plan-ec2-instances.md)。

 以下指导方针适用于大部分 Amazon EMR 集群。
+ 每个 AWS 账户上运行的按需 Amazon EC2 实例总数有 vCPU 限制。 AWS 区域有关 vCPU 限制以及如何请求为账户提高限制的更多信息，请参阅《Amazon EC2 用户指南（适用于 Linux 实例）》****中的[按需实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html)。
+ 主节点通常没有大型计算需求。对于具有大量节点的集群，或者对于具有专门部署在主节点（Hue JupyterHub 等）上的应用程序的集群，可能需要更大的主节点，这有助于提高集群性能。例如，对于小型集群（50 个或更少的节点），考虑使用 m5.xlarge 实例；对于较大的实例类型，考虑增加更大的集群类型。
+ 核心及任务节点的计算需求取决于您的应用程序将执行的处理类型。许多任务能够在通用型实例类型上运行，该类型在 CPU、磁盘空间和输入/输出方面提供了均衡的性能。计算密集型集群可能受益于在 CPU 增强型实例上运行，这些实例的 CPU 在比例上比 RAM 更高。数据库和内存缓存应用程序可能受益于在内存增强型实例上运行。网络密集型和 CPU 密集型应用程序（如解析、NLP 和机器学习）可能受益于在集群计算实例上运行，这些实例提供高比例的 CPU 资源和增强的网络性能。
+ 如果集群的不同阶段有不同的容量需求，您可以开始使用少量核心节点，并随时增加或减少任务节点的数量来满足任务流程不断变化的容量要求。
+ 您可以处理的数据量取决于核心节点的容量以及作为输入的数据、处理期间的数据和作为输出的数据的大小。在处理期间，输入、中间和输出数据集都存储在集群上。

## 什么时候应该使用竞价型实例？
<a name="emr-plan-spot-instances"></a>

在 Amazon EMR 中启动集群时，您可以选择在竞价型实例上启动主实例、核心实例或任务实例。因为每类实例组在集群中发挥的作用不同，所以，在竞价型实例上启动每个节点类型都会有影响。集群在运行时，您不能更改实例的购买选项。要将主节点和核心节点从按需型实例更改为竞价型实例或者反向操作，您必须终止该集群，并启动一个新集群。对于任务节点，您可以启动新的任务实例组或实例队列，并删除旧的任务实例组或实例队列。

**Topics**
+ [用于防止因任务节点竞价型实例终止而导致任务失败的 Amazon EMR 设置](#emr-plan-spot-YARN)
+ [竞价型实例上的主节点](#emr-dev-master-instance-group-spot)
+ [Spot 实例上的核心节点](#emr-dev-core-instance-group-spot)
+ [Spot 实例上的任务节点](#emr-dev-task-instance-group-spot)
+ [适用于应用程序场景的实例配置](#emr-plan-spot-scenarios)

### 用于防止因任务节点竞价型实例终止而导致任务失败的 Amazon EMR 设置
<a name="emr-plan-spot-YARN"></a>

由于竞价型实例通常用于运行任务节点，而 Amazon EMR 具有调度 YARN 任务的默认功能，因此在竞价型实例上运行的任务节点终止时，正在运行的任务不会失败。Amazon EMR 通过允许应用程序主进程仅在核心节点上运行来实现这一目标。应用程序主进程控制正在运行的任务，并且需要在任务的整个生命周期内保持活动状态。

Amazon EMR 发行版 5.19.0 及更高版本使用内置 [YARN 节点标签](https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/NodeLabel.html)功能来实现这一目标。（早期版本使用代码补丁）。`yarn-site` 中的属性和 `capacity-scheduler` 配置分类是默认配置，以便 YARN capacity-scheduler 和 fair-scheduler 利用节点标注。Amazon EMR 自动为核心节点添加 `CORE` 标注，并设置属性，以便只在具有 CORE 标签的节点上安排应用程序主节点。手动修改 yarn-site 和 capacity-scheduler 配置分类中的相关属性，或直接在关联的 XML 文件中修改相关属性，可能会破坏此功能或调整此功能。

默认情况下，Amazon EMR 会配置以下属性和值。配置这些属性时要谨慎。

**注意**  
从 Amazon EMR 6.x 发行版系列开始，默认情况下禁用 YARN 节点标注功能。默认情况下，应用程序主进程可以在核心节点和任务节点上运行。您可以通过配置以下属性来启用 YARN 节点标注功能：  
`yarn.node-labels.enabled: true`
`yarn.node-labels.am.default-node-label-expression: 'CORE'`
+ **yarn-site (yarn-site.xml)（在所有节点上）**
  + `yarn.node-labels.enabled: true`
  + `yarn.node-labels.am.default-node-label-expression: 'CORE'`
  + `yarn.node-labels.fs-store.root-dir: '/apps/yarn/nodelabels'`
  + `yarn.node-labels.configuration-type: 'distributed'`
+ **yarn-site (yarn-site.xml) 在主节点和核心节点上**
  + `yarn.nodemanager.node-labels.provider: 'config'`
  + `yarn.nodemanager.node-labels.provider.configured-node-partition: 'CORE'`
+ **capacity-scheduler (capacity-scheduler.xml)（在所有节点上）**
  + `yarn.scheduler.capacity.root.accessible-node-labels: '*'`
  + `yarn.scheduler.capacity.root.accessible-node-labels.CORE.capacity: 100`
  + `yarn.scheduler.capacity.root.default.accessible-node-labels: '*'`
  + `yarn.scheduler.capacity.root.default.accessible-node-labels.CORE.capacity: 100`

### 竞价型实例上的主节点
<a name="emr-dev-master-instance-group-spot"></a>

主节点会控制和引导集群。当它终止时，集群也随之终止。因此，如果您正在运行可接受突然终止的集群，那么，您应当只以竞价型实例方式启动主节点。如果您在测试新的应用程序，或者您拥有的集群会定期地将数据保存到外部存储器（如 Amazon S3）。或者在运行的集群中成本比确保集群完成更重要，就可能属于这种情况。

以竞价型实例方式启动主实例组时，集群在竞价型实例请求实现后才会启动。在您选择最高 Spot 价格时，请考虑这个因素。

启动集群时，只能添加竞价型实例主节点。在正在运行的集群上，不能添加或删除主节点。

一般情况下，如果以竞价型实例方式运行整个集群（所有的实例组），就只能以竞价型实例方式运行主节点。

### Spot 实例上的核心节点
<a name="emr-dev-core-instance-group-spot"></a>

核心节点处理数据并使用 HDFS 存储信息。终止一个核心实例会面临数据丢失的风险。因此，仅当允许丢失部分 HDFS 数据时，才能在竞价型实例上运行核心节点。

当以竞价型实例方式启动核心实例组时，Amazon EMR 会持续等候，直到可以在启动实例组前预置所有已请求的核心实例。换言之，如果您请求六个 Amazon EC2 实例，但在您的最高 Spot 价格水平及该水平以下只能获得五个节点，那么实例组将不会启动。Amazon EMR 将继续等待，直到这六个 Amazon EC2 实例都可用，或者直到您终止集群。您可以更改核心实例组中竞价型实例的数量以增加运行中集群的容量。有关如何使用实例组，以及竞价型实例如何与实例队列结合使用的更多信息，请参阅[使用实例集或统一实例组创建 Amazon EMR 集群](emr-instance-group-configuration.md)。

### Spot 实例上的任务节点
<a name="emr-dev-task-instance-group-spot"></a>

任务节点处理数据，但不使用 HDFS 保存持久性数据。如果它们因为 Spot 价格上涨超过最高 Spot 价格而终止，那么不会丢失数据，对您的集群的影响会降低到最低程度。

当您以竞价型实例的方式启动一个或多个任务实例组时，Amazon EMR 会预置使用您的最高 Spot 价格所能获得的最多任务节点。这意味着，如果您请求一个具有六个节点的任务实例组，但在您的最高 Spot 价格水平及该水平以下只能获得五个竞价型实例，那么 Amazon EMR 将使用五个节点启动该实例组，等到以后情况允许了再添加第六个。

以竞价型实例方式启动任务实例组是在尽可能降低成本的同时扩展集群容量的一种策略。如果您以按需型实例方式启动主实例组和核心实例组，则其容量可以保证集群运行。您可以根据需要向任务实例组添加任务实例，从而处理峰值流量或者加快数据处理速度。

您可以使用控制台、 AWS CLI或 API 添加或移除任务节点。还可以添加更多任务组，但任务组一经创建将不可删除。

### 适用于应用程序场景的实例配置
<a name="emr-plan-spot-scenarios"></a>

下表是通常适用于各种应用程序场景的节点类型购买选项和配置的快速参考。选择该链接以查看有关每个场景类型的更多信息。


| 应用程序场景 | 主节点购买选项 | 核心节点购买选项 | 任务节点购买选项 | 
| --- | --- | --- | --- | 
| [长时间运行的集群和数据仓库](#emr-dev-when-use-spot-data-warehouses) | 按需型 | 按需或实例队列组合 | Spot 或实例队列组合 | 
| [成本驱动型工作负载](#emr-dev-when-use-spot-cost-driven) | Spot | Spot | Spot | 
| [数据关键型工作负载](#emr-dev-when-use-spot-data-critical) | 按需型 | 按需型 | Spot 或实例队列组合 | 
| [应用程序测试](#emr-dev-when-use-spot-application-testing) | Spot | Spot | Spot | 

 有几种情况应使用竞价型实例运行 Amazon EMR 集群。

#### 长时间运行的集群和数据仓库
<a name="emr-dev-when-use-spot-data-warehouses"></a>

如果您运行的是持续性的、可预测计算容量变化的 Amazon EMR 集群，如数据仓库，就可以通过竞价型实例以更低的成本处理峰值需求。您可以按需型实例方式启动主实例组和核心实例组来处理正常容量，并以竞价型实例方式启动任务实例组来处理峰值负载需求。

#### 成本驱动型工作负载
<a name="emr-dev-when-use-spot-cost-driven"></a>

如果您运行的是临时集群，降低成本比完成时间更为重要，并且可以接受丢失部分工作，那么，以竞价型实例方式运行整个集群（主实例组、核心实例组和任务实例组）可以享受最大的成本节省优势。

#### 数据关键型工作负载
<a name="emr-dev-when-use-spot-data-critical"></a>

如果对于您运行的集群，降低成本比保证完成时间更为重要，但不能接受丢失部分工作，则建议您以按需型实例方式启动主实例组和核心实例组，并辅以采用竞价型实例的一个或多个任务实例组。以按需型实例方式运行主实例组和核心实例组，可确保您的数据持久保存到 HDFS 中，并且可保护集群不会因为 Spot 市场上的价格波动而终止，同时可通过以竞价型实例方式运行任务实例组来实现成本节省。

#### 应用程序测试
<a name="emr-dev-when-use-spot-application-testing"></a>

当为生产环境做启动准备而测试新的应用程序时，您可以按竞价型实例的方式运行整个集群（主实例组、核心实例组和任务实例组），从而降低测试成本。

## 计算集群的必需的 HDFS 容量
<a name="emr-plan-instances-hdfs"></a>

 可供集群使用的 HDFS 存储量取决于以下因素：
+ 用于核心节点的 Amazon EC2 实例的数量。
+ 用于使用的实例类型的 Amazon EC2 实例存储的容量。有关实例存储卷的更多信息，请参阅《Amazon EC2 用户指南》**中的 [Amazon EC2 实例存储](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html)。
+ 附加到核心节点的 Amazon EBS 卷的数量和大小。
+ 一个重复因子，它将考虑每个数据块存储在 HDFS 中以实现类似 RAID 的冗余的方式。默认情况下，对于包含 10 个或更多核心节点的集群，重复因子为 3；对于包含 4-9 个核心节点的集群，重复因子为 2；对于包含 3 个或更少核心节点的集群，重复因子为 1。

要为每个核心节点计算集群的 HDFS 容量，请将实例存储卷容量添加到 Amazon EBS 存储容量 (如果已使用)。将结果乘以核心节点数，然后将乘积除以基于核心节点数确定的复制因子。例如，某个集群具有 10 个 i2.xlarge 类型的核心节点，这些节点具有 800 GB 的实例存储 (没有附加的 Amazon EBS 卷)，该集群总共有约 2,666 GB 可用于 HDFS 的存储 (10 节点 x 800 GB ÷ 3 复制因子)。

 如果计算出的 HDFS 容量值小于您的数据，则可通过以下方式增大 HDFS 存储量：
+ 创建带其他 Amazon EBS 卷的集群或将带附加的 Amazon EBS 卷的实例组添加到现有集群
+ 添加多个核心节点
+ 选择带更大存储容量的 Amazon EC2 实例类型
+ 使用数据压缩
+ 更改 Hadoop 配置设置以减小重复因子

减少重复因子的方法应谨慎使用，因为这会降低 HDFS 数据的冗余程度以及集群从丢失或损坏的 HDFS 数据块中恢复的能力。