gpt4 book ai didi

apache-spark - 为什么 EMR 上的 Yarn 不会将所有节点分配给正在运行的 Spark 作业?

转载 作者:行者123 更新时间:2023-12-03 14:48:54 25 4
gpt4 key购买 nike

我在 Amazon Elastic Map Reduce (EMR) 上运行 Apache Spark 上的作业。目前我在 emr-4.1.0 上运行,其中包括 Amazon Hadoop 2.6.0 和 Spark 1.5.0。

当我开始工作时,YARN 已正确地将所有工作节点分配给 spark 工作(当然,有一个用于驱动程序)。

我将神奇的“maximizeResourceAllocation”属性设置为“true”,并且 spark 属性“spark.dynamicAllocation.enabled”也设置为“true”。

但是,如果我通过将节点添加到工作机器的 CORE 池来调整 emr 集群的大小,YARN 只会将一些新节点添加到 spark 作业中。

例如,今天早上我有一份工作使用 26 个节点(m3.2xlarge,如果这很重要)——1 个用于驱动程序,25 个执行器。我想加快工作速度,所以我尝试再添加 8 个节点。 YARN 已拾取所有新节点,但仅将其中 1 个分配给 Spark 作业。 Spark 确实成功地拾取了新节点并将其用作执行程序,但我的问题是为什么 YARN 让其他 7 个节点闲置?

这很烦人,原因很明显——即使资源没有被使用,我也必须为资源付费,而且我的工作根本没有加速!

有人知道 YARN 是如何决定何时将节点添加到运行 spark 作业的吗?哪些变量会起作用?内存? V核?任何事物?

提前致谢!

最佳答案

好的,在 @sean_r_owen 的帮助下,我能够追踪到这一点。

问题是这样的:当设置 spark.dynamicAllocation.enabledtrue , spark.executor.instances不应该设置 - 一个明确的值将覆盖动态分配并将其关闭。事实证明,如果您不自己设置,EMR 会在后台设置它。要获得所需的行为,您需要显式设置 spark.executor.instances为 0。

作为记录,这里是我们传递给 --configurations 的文件之一的内容。创建 EMR 集群时的标志:

[
{
"Classification": "capacity-scheduler",
"Properties": {
"yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
}
},

{
"Classification": "spark",
"Properties": {
"maximizeResourceAllocation": "true"
}
},

{
"Classification": "spark-defaults",
"Properties": {
"spark.dynamicAllocation.enabled": "true",
"spark.executor.instances": "0"
}
}
]

这为我们提供了一个 EMR 集群,其中 Spark 在运行作业时使用所有节点,包括添加的节点。它似乎也使用了所有/大部分内存和所有(?)内核。

(我不完全确定它是否使用了所有实际内核;但它肯定使用了超过 1 个 VCore,这是以前没有的,但按照 Glennie Helles 的建议,它现在表现得更好,并且使用了列出的 VCore 的一半,这似乎等于实际的核心数......)

关于apache-spark - 为什么 EMR 上的 Yarn 不会将所有节点分配给正在运行的 Spark 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33940884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com