Spark + EMR使用亚马逊"最大化资源配置"设置不使用所有核心/ vcores

时间:2015-11-30 16:51:57

标签: apache-spark yarn emr amazon-emr elastic-map-reduce

我正在使用特定于亚马逊的maximizeResourceAllocation标记运行适用于Spark的EMR集群(版本emr-4.2.0)here。根据这些文档,"此选项计算核心节点组中节点上执行程序可用的最大计算和内存资源,并使用此信息设置相应的spark-defaults设置"。

我使用m3.2xlarge实例为工作节点运行集群。我使用单个m3.xlarge作为YARN master - 我可以运行的最小的m3实例,因为它没有做太多。

情况是这样的:当我运行Spark作业时,每个执行程序请求的核心数是8.(我只是在配置"yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"之后才得到这个,但实际上并不是在文档中,但是我离题了)。这似乎是有道理的,因为根据these docs m3.2xlarge有8" vCPU"。但是,对于实际实例本身,在/etc/hadoop/conf/yarn-site.xml中,每个节点都配置为将yarn.nodemanager.resource.cpu-vcores设置为16。我(猜测)认为这必定是因为超线程或者其他一些硬件的原因。

所以问题是这样的:当我使用maximizeResourceAllocation时,我得到了" vCPU"亚马逊实例类型具有的,这似乎只是配置的" VCores"的数量的一半。 YARN已在节点上运行;因此,执行程序仅使用实例上实际计算资源的一半。

这是Amazon EMR中的错误吗?其他人是否遇到同样的问题?是否还有一些我缺少的其他魔法无证配置?

3 个答案:

答案 0 :(得分:36)

好的,经过大量的实验,我能够找到问题所在。我将在这里报告我的发现,以帮助人们避免将来感到沮丧。

  • 虽然要求的8个核心与YARN知道的16个核心之间存在差异,但这似乎没有什么区别。 YARN没有使用cgroup或任何花哨的东西来实际限制执行者实际可以使用的CPU数量。
  • 执行者的“核心”实际上有点用词不当。实际上,执行者在任何时候都愿意运行多少个并发任务;实质上归结为有多少线程在每个执行器上“正常工作”。
  • 设置maximizeResourceAllocation时,运行Spark程序时,会将属性spark.default.parallelism设置为所有非主实例的实例核心数(或“vCPU”)。在创建时的群集中。即使在正常情况下,这可能太小了;我听说建议将此值设置为运行作业所需的核心数的4倍。这将有助于确保在任何给定阶段有足够的任务可以保持CPU在所有执行器上忙碌。
  • 当您拥有来自不同运行的不同火花程序的数据时,您的数据(以RDD或Parquet格式或其他形式)很可能会以不同数量的分区保存。运行Spark程序时,请确保在加载时或特别CPU密集型任务之前重新分区数据。由于您可以在运行时访问spark.default.parallelism设置,因此这可以是一个方便的号码来重新分配。

<强> TL; DR

  1. maximizeResourceAllocation几乎可以为你做任何事情,除了......
  2. 您可能希望将spark.default.parallelism显式设置为您想要在每个“步骤”(在EMR中说话)/“应用程序”(在YARN中说话)的基础上运行作业的4x实例核心数,即每次都设置和...
  3. 确保程序您的数据已正确分区(即需要多个分区)以允许Spark正确并行化

答案 1 :(得分:2)

使用此设置,每个实例(主设备除外)应该有1个执行程序,每个实例有8个内核和大约30GB的RAM。

Spark UI是否为http://:8088 /未显示该分配?

我不确定与该页面上提到的另一个“启用执行程序的动态分配”相比,该设置确实很有价值。这将让Spark管理它自己的工作实例数量,如果你为每个执行器启动一个具有2个CPU内核和3G RAM的任务,那么对于EMR的实例大小,你将获得相当高的CPU与内存比率。

答案 2 :(得分:0)

在EMR版本3.x中,这个maximizeResourceAllocation是用参考表实现的:https://github.com/awslabs/emr-bootstrap-actions/blob/master/spark/vcorereference.tsv

它由shell脚本使用:maximize-spark-default-config,在同一个仓库中,您可以看看它们是如何实现的。

也许在新的EMR版本4中,这个参考表在某种程度上是错误的......我相信你可以在EMR的EC2实例中找到所有这个AWS脚本,应该位于 / usr / lib / spark < / em>或 / opt / aws 或类似的东西。

无论如何,至少,您可以在EMR 4中为此编写自己的bootstrap action脚本,并使用正确的参考表,类似于EMR 3.x中的实现

此外,由于我们将使用 STUPS 基础架构,值得一看 STUPS设备的Spark https://github.com/zalando/spark-appliance

您可以在部署spark群集时通过设置senza参数DefaultCores来明确指定核心数

与EMR相比,此设备的一些亮点是:

能够使用甚至t2实例类型,基于其他STUPS设备等角色自动扩展等。

您可以使用zookeeper 在 HA模式下轻松部署群集,因此主节点上没有SPOF,EMR中的HA模式目前仍然无法实现,我相信EMR主要是为“大型”设计的临时用于临时分析作业的集群“,而不是”永久打开的专用集群“,因此在EMR附近将无法实现HA模式。