增强 Amazon EMR 的扩展能力与应用程序主控位置 大数据博客

提升 Amazon EMR 的扩展能力与应用主位置管理

关键要点

在数据驱动的时代,高效处理大数据集对于企业获得洞察力和保持竞争优势至关重要。本篇文章介绍了 Amazon EMR弹性 MapReduce如何在 EC2 上通过新的应用主Application Master,AM位置管理功能增强其扩展能力。此功能可确保 AM 容器分配到可靠节点,从而提高应用程序的可靠性,优化资源利用率和成本效率。

在 Amazon EMR 版本 72 发布之后,应用主标签意识功能允许用户通过 YARN 节点标签在仅按需实例上分配 AM 容器。这有助于避免因使用 Spot 实例而导致的 AM 容器丢失及 YARN 应用程序的即时关闭。通过实现这个功能,集群管理员可以实现更精确的资源分配、改进的应用程序可靠性和成本效率。

解决方案概述

Amazon EMR 的应用主标签意识功能与 YARN 节点标签协同工作,使用户能够定义 Hadoop 集群中节点的标签。用户可以根据这些标签决定特定 YARN 容器如映射器 vs 归约器或 Spark 的驱动程序 vs 执行器应该在哪些节点上托管。

当使用 Amazon EMR 720 及以后的版本并启用管理扩展时,此功能默认启用。以下代码是一个基本的配置示例,用于开启此功能:

json[ { Classification yarnsite Properties { yarnnodelabelsenabled true yarnnodelabelsamdefaultnodelabelexpression ONDEMAND } }]

在此配置片段中,我们激活了 Hadoop 节点标签特性,并为 yarnnodelabelsamdefaultnodelabelexpression 属性定义了一个值。该属性定义了每个提交到集群 YARN 应用程序的 AM 容器将使用的 YARN 节点标签。准确地将其分配到可靠节点对于生产工作负载至关重要,因为意外关闭此容器可能导致整个应用程序的关闭和失败。

当前,应用主标签意识功能仅支持两种预定义节点标签:ONDEMAND 和 CORE。当使用 Amazon EMR 配置定义其中一个标签时,Amazon EMR 会自动在 YARN 中创建相应节点标签并相应标记集群中的实例。

为示范如何使用此功能,我们将启动一个示例集群并运行一些 Spark 作业,观察 Amazon EMR 管理扩展是如何与 YARN 节点标签集成的。

启动 EMR 集群并启用应用主位置意识

要进行测试,您可以启动以下 AWS CloudFormation 堆栈,该堆栈配置了一个启用了管理扩展以及应用主位置意识功能的 EMR 集群。如果您是第一次启动 EMR 集群,请确保使用以下 AWS 命令行界面 命令创建 Amazon EMR 默认角色:

bashaws emr createdefaultroles

随后,选择 Launch Stack 启动集群:

提供以下所需参数:

VPC 您账户中现有的虚拟私有云VPC,集群将在其中配置Subnet 您希望启动集群的 VPC 子网SSH Key Name 您用于连接到 EMR 主节点的 EC2 密钥对

EMR 集群配置完毕后,请通过设置 SSH 隧道连接到 Hadoop 资源管理器 Web UI,查看集群配置。访问资源管理器 Web UI 的步骤如下:

使用动态端口转发设置 SSH 隧道到主节点。使用集群主节点的公共 DNS 名称将浏览器指向 http//ltprimarynodepublicdnsgt8088/。

这将打开 Hadoop 资源管理器 Web UI,您可以查看集群的配置情况。

YARN 节点标签

在您启动的 CloudFormation 堆栈中,您指定在标记为 ONDEMAND 的节点上分配 AM 容器。如果您探索资源管理器 Web UI,您可以看到 Amazon EMR 在集群中创建了两个标签:ONDEMAND 和 SPOT。要查看集群中存在的 YARN 节点标签,您可以查看 节点标签 页面,如下所示:

在此页面上,您可以看到 Amazon EMR 如何创建 YARN 标签:

在初始集群创建过程中,默认节点标签如 ONDEMAND 和 SPOT会作为非独占分区自动生成。DEFAULTPARTITION 标签保持空缺,因为每个节点根据其市场类型标记即是按需实例还是 Spot 实例。

在我们的示例中,由于我们将一个核心节点作为按需实例启动,因此可以观察到一个节点被分配到 ONDEMAND 分区,而 SPOT 分区保持空白。因为标签被创建为非独占的,所以带有这些标签的节点可以同时运行带有特定 YARN 标签的容器和不指定 YARN 标签的容器。有关 YARN 节点标签的其他详细信息,请参阅 YARN 节点标签 的 Hadoop 文档。

现在我们已经讨论了集群的配置,我们可以进行一些测试来验证和检查在与管理扩展结合使用时此功能的行为。

同时提交应用程序与 Spot 实例

为了测试管理扩展功能,我们提交一个简单的 SparkPi 作业,配置为使用我们集群中初始启动的单个核心节点上的所有可用内存:

bashsparkexample deploymode cluster drivermemory 10g executormemory 10g conf sparkdynamicAllocationmaxExecutors=1 conf sparkyarnexecutornodeLabelExpression=SPOT SparkPi 800000

在前面的代码片段中,我们对特定的 Spark 配置进行了调整,以利用集群节点上所有资源您也可以在启动 EMR 集群时使用 maximizeResourceAllocation 配置来实现这一点。因为集群是使用 m5xlarge 实例启动的,所以我们的内存需求可达到 12 GB。基于这些假设,配置了以下内容:

Spark 驱动程序和执行器的配置为 10 GB 内存,以利用节点上的大部分可用内存,以便简化示例,使每个节点运行单个容器。nodelabelsamdefaultnodelabelexpression 参数设置为 ONDEMAND,确保 Spark 驱动程序自动分配到我们的集群的 ONDEMAND 分区。因为我们在启动集群时指定了此配置,所以 AM 容器会自动请求在标记为 ONDEMAND 的实例上调度,从而无需在作业级别指定。yarnexecutornodeLabelExpression=SPOT 配置确保只有在 TASK 节点上使用 Spot 实例运行执行器。如果移除该配置,Spark 执行器将可以在 SPOT 和 ONDEMAND 标记的节点上进行调度。将 dynamicAllocationmaxExecutors 设置为 1 以延迟应用程序的处理时间,同时观察在同一集群中同时提交多个 YARN 应用程序时的扩展行为。

当应用程序转换为 RUNNING 状态时,我们可以从 YARN 资源管理器 UI 验证其驱动程序位置已自动分配给我们集群的 ONDEMAND 分区见下图。

另外,在检查 YARN 调度器页面时,我们可以看到,由于集群只启动了一个按需实例,所以 SPOT 分区没有关联任何资源。

由于集群最初没有 Spot 实例,您可以从 Amazon EMR 控制台观察到,管理扩展生成了一个新的 Spot 任务组,以容纳请求在仅 Spot 节点上运行的 Spark 执行器见下图。在此集成之前,管理扩展并未考虑应用程序请求的 YARN 标签,可能导致扩展行为不可预测。但借助此版本,管理扩展现在会考虑应用程序指定的 YARN 标签,使扩展决策更加可预测和准确。

在等待新的 Spot 节点启动时,我们提交了另一个具有相同规格的 SparkPi 作业。然而,由于分配新 Spark 驱动程序所需的内存为 10 GB,而此时 ONDEMAND 分区中此类资源不可用,应用程序保持在挂起状态,直到可以调度其容器的资源变得可用。

当 Amazon EMR 检测到没有资源可分配给新 Spark 驱动程序时,管理扩展开始通过启动新的核心节点来扩展核心实例组集群中的按需实例。在新核心节点启动后,YARN 迅速在新节点上分配了挂起的容器,允许应用程序开始处理。随后,应用程序请求额外的 Spot 节点来分配其执行器见下图。

飞跃加速器官网入口

这个例子展示了管理扩展和 YARN 标签如何协同工作,从而改善 YARN 应用程序的弹性,同时利用 Spot 实例进行成本效益高的作业执行。

增强 Amazon EMR 的扩展能力与应用程序主控位置 大数据博客

何时使用应用主位置意识和管理扩展

您可以使用此位置意识功能通过使用 Spot 实例来提高成本效率,同时保护应用主免于因 Spot 中断而被错误关闭。这在您想享受 Spot 实例带来的成本节省同时又保持集群中作业的稳定性和可靠性时尤为有效。在使用管理扩展和位置意识功能时,请考虑以下最佳实践:

最大化非关键作业的成本效率 如果您的作业没有严格的服务等级协议SLA要求,可以将所有 Spark 执行器强制运行在 Spot 实例上,以最大化成本节省。这可以通过设置以下 Spark 配置实现:

bashsparkyarnexecutornodeLabelExpression=SPOT

生产作业的弹性执行 对于需要更高弹性执行的生产作业,可能考虑不设置 yarnexecutornodeLabelExpression 参数。在未指定标签的情况下,执行器将在按需和 Spot 节点之间动态分配,从而提供更可靠的执行。限制并发应用程序的动态分配 当与管理扩展和同时运行多个应用程序的集群例如,具有并发用户使用的交互式集群一起工作时,应考虑使用 dynamicAllocationmaxExecutors 设置来设定 Spark 动态分配的最大限制。这可以帮助管理资源的过度分配,并促进在同一集群上运行的应用程序之间的可预测扩展行为。有关更多详细信息,请参见 Spark 文档中的 动态分配。管理扩展配置 确保正确设置您的管理扩展配置,以便根据您的工作负载需求有效扩展 Spot 实例。例如,根据您希望在集群上同时运行的应用程序数量,设置管理扩展中 最大按需实例 的适当值。此外,如果您计划仅在 AM 容器上使用按需实例,我们建议将 schedulercapacitymaximumamresourcepercent 设置为 1,使用 Amazon EMR 容量调度程序分类。提升节点启动时间 如果您的集群经常面临扩展事件例如,您有一个长时间运行的集群可以运行多个并发 EMR 步骤,您可能希望优化集群节点的启动时间。在努力实现高效节点启动时,请考虑只在集群中安装最小所需应用框架,尽可能避免安装可能延迟动态附加节点启动的非 YARN 框架,如 HBase 或 Trino。最后,尽量不要使用复杂且耗时的 EMR 启动操作,以避免增加使用管理扩展启动的节点的启动时间。

通过遵循这些最佳实践,您可以在保持应用程序的稳定性和可靠性的同时,最大限度地利用 Spot 实例的成本节省,尤其是在多个应用程序同时在同一集群上运行的情况下。

结论

在本文中,我们探讨了 Amazon EMR 管理扩展与 YARN 节点标签之间的新集成的好处,回顾了其实施和使用,并定义了一些最佳实践以帮助您入门。无论您是在 Amazon EMR 上运行批处理作业、流处理应用程序还是其他 YARN 工作负载,此功能都可以帮助您实现显著的成本节省,同时不影响性能或可靠性。

在您开始在 EMR 集群中使用 Spot 实例时,请记得遵循本文中概述的最佳实践,例如为动态分配、节点标签表达式和管理扩展策略设置适当的配置。通过这样做,您可以确保您的应用程序高效、可靠且以最低成本运行。

作者介绍

Lorenzo Ripani 是 AWS 的大数据解决方案架构师。他对分布式系统、开源技术和安全性充满热情。他的大部分时间都在与全球客户合作,设计、评估和优化使用 Amazon EMR 的可扩展和安全的数据管道。

Miranda Diaz 是 AWS EMR 的软件开发工程师。Miranda 致力于设计和开发技术,以便全球客户可以根据需求自动扩展计算资源,帮助他们在最佳成本下实现最佳性能。

Sajjan Bhattarai 是 AWS 的高级云支持工程师,专注于大数据和机器学习工作负载。他喜欢帮助全球客户排查和优化他们的数据平台。

Bezuayehu Wate 是 AWS 的助理大数据专业解决方案架构师。她与客户合作,提供战略和架构指导,帮助他们设计、构建和现代化基于云的分析解决方案。