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

集群配置指南和最佳实践

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

您应使用哪个实例类型?

可以通过多种方式将 EC2 实例添加到集群,具体取决于您对集群使用的是实例组配置还是实例队列配置。

  • 实例组

    • 手动将同一类型的实例添加到现有的核心和任务实例组。

    • 手动添加任务实例组,该组可使用其他实例类型。

    • 在 Amazon EMR 中为实例组设置自动扩展,并根据您指定的 Amazon CloudWatch 指标值来自动添加和删除实例。有关更多信息,请参阅扩展集群资源

  • 实例队列

    • 添加一个任务实例队列。

    • 对于现有的核心和任务实例队列,更改按需实例和 Spot 实例的目标容量。有关更多信息,请参阅 配置实例队列

规划集群实例的一个方法是,使用代表性的示例数据集运行测试集群并监控集群中节点的利用。有关更多信息,请参阅 查看和监控集群。另一种方法是计算您在考虑的实例的容量,并将该容量值与数据的大小做比较。

通常,分配任务的主节点类型不需要 EC2 实例和很高的处理能力;核心节点类型的 EC2 实例 (处理任务并将数据存储在 HDFS 中) 需要处理能力和存储容量;任务节点类型的 EC2 实例 (不存储数据) 只需要处理能力。有关可用的 EC2 实例及其配置的准则,请参阅配置 EC2 实例

以下指导方针适用于大部分 Amazon EMR 集群。

  • 主节点没有大型计算需求。对于大多数包含 50 个或更少节点的集群,请考虑使用 m5.xlarge 实例。对于节点数超过 50 的集群,请考虑使用 m4.xlarge。

  • 核心及任务节点的计算需求取决于您的应用程序将执行的处理类型。许多任务能够在 m5.xlarge 实例类型上运行,该类型在 CPU、磁盘空间和输入/输出方面提供了均衡的性能。如果您的应用程序具有导致延迟的外部依赖项 (如收集数据的 Web 网络爬取),则您也许能够在实例等待依赖项完成时,在 t2.medium 实例上运行集群以降低成本。如想改进性能,请考虑使用核心及任务节点的 m4.xlarge 实例运行集群。如果集群的不同阶段有不同的容量需求,您可以开始使用少量核心节点,并随时增加或减少任务节点的数量来满足任务流程不断变化的容量要求。

  • 大多数 Amazon EMR 集群都能在标准 EC2 实例类型(如 m5.xlarge 和 m4.xlarge)上运行。计算密集型集群可能受益于在 CPU 增强型实例上运行,这些实例的 CPU 在比例上比 RAM 更高。数据库和内存缓存应用程序可能受益于在内存增强型实例上运行。网络密集型和 CPU 密集型应用程序 (像解析、NLP 和机器学习) 可能受益于在集群计算实例上运行,这些实例提供高比例的 CPU 资源和增强的网络性能。

  • 您可以处理的数据量取决于核心节点的容量以及作为输入的数据、处理期间的数据和作为输出的数据的大小。在处理期间,输入、中间和输出数据集都存储在集群上。

  • 默认情况下,您可以在单个 AWS 账户上运行的 EC2 实例的总数是 20。这意味着,您在集群中可以拥有的节点总数为 20。有关如何请求为账户提高限制的详细信息,请参阅 AWS 限制

什么时候应该使用 Spot 实例?

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

用于防止因任务节点 Spot 实例终止而导致作业失败的 Amazon EMR 设置

由于 Spot 实例通常用于运行任务节点,Amazon EMR 具有以下默认功能:计划 YARN 任务,从而使正在运行的任务在正在 Spot 实例上运行的任务节点终止时不会失败。Amazon EMR 通过允许应用程序主进程仅在核心节点上运行来达到此目的。应用程序主进程控制正在运行的任务,并需要在任务的整个生命周期内保持活动状态。

Amazon EMR 发布版 5.19.0 和更高版本使用内置的 YARN 节点标签功能来达到此目的。(早期版本使用代码补丁)。默认情况下,将配置 yarn-sitecapacity-scheduler 配置分类中的属性,从而为使 YARN 容量计划程序和公平计划程序能够利用节点标签。Amazon EMR 将自动使用 CORE 标签来标记核心节点,并设置属性以使主应用程序仅在具有 CORE 标签的节点上计划。在 yarn-site 和容量计划程序配置分类中手动修改相关属性或者直接在关联的 XML 文件中修改相关属性可能会破坏此功能或修改此功能。

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

  • 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

Spot 实例上的主节点

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

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

启动集群时,只能添加 Spot 实例主节点。在正在运行的集群上,不能添加或移除主节点。

一般情况下,如果以 Spot 实例方式运行整个集群 (所有的实例组)。就只能以 Spot 实例方式运行主节点。

Spot 实例上的核心节点

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

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

Spot 实例上的任务节点

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

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

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

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

适用于应用程序场景的实例配置

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

应用程序场景 主节点购买选项 核心节点购买选项 任务节点购买选项
长时间运行的集群和数据仓库 按需 按需或实例队列组合 Spot 或实例队列组合
成本驱动型工作负载 Spot 实例 Spot 实例 Spot 实例
数据关键型工作负载 按需 按需 Spot 或实例队列组合
应用程序测试 Spot 实例 Spot 实例 Spot 实例

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

长时间运行的集群和数据仓库

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

成本驱动型工作负载

如果您运行的是暂时性的集群,降低成本比完成时间更重要,且可以接受损失部分工作,那么,以 Spot 实例的方式运行整个集群 (主实例组、核心实例组和任务实例组) 可以享受最大的成本节约好处。

数据关键型工作负载

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

应用程序测试

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

计算集群的必需的 HDFS 容量

可用于您的集群的 HDFS 存储量取决于以下因素:

  • 用于核心节点的 EC2 实例的数量。

  • 用于使用的实例类型的 EC2 实例存储的容量。有关实例存储卷的更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例)中的 Amazon EC2 实例存储

  • 附加到核心节点的 EBS 卷的数量和大小。

  • 一个重复因子,它将考虑每个数据块存储在 HDFS 中以实现类似 RAID 的冗余的方式。默认情况下,对于包含 10 个或更多核心节点的集群,重复因子为 3;对于包含 4-9 个核心节点的集群,重复因子为 2;对于包含 3 个或更少核心节点的集群,重复因子为 1。

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

如果计算出的 HDFS 容量值小于您的数据,则可通过以下方式增大 HDFS 存储量:

  • 创建带其他 EBS 卷的集群或将带附加的 EBS 卷的实例组添加到现有集群

  • 添加多个核心节点

  • 选择带更大存储容量的 EC2 实例类型

  • 使用数据压缩

  • 更改 Hadoop 配置设置以减小重复因子

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