

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

# 为竞价型实例配置 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 集群。
+ 每个 Amazon 账户上运行的按需 Amazon EC2 实例总数有 vCPU 限制。 Amazon Web Services 区域有关 vCPU 限制以及如何请求为账户提高限制的更多信息，请参阅《Amazon EC2 用户指南（适用于 Linux 实例）》****中的[按需实例](https://docs.amazonaws.cn/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 将使用五个节点启动该实例组，等到以后情况允许了再添加第六个。

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

您可以使用控制台、 Amazon 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.amazonaws.cn/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 数据块中恢复的能力。