为什么EMR上的Yarn不会将所有节点都分配给运行Spark作业?

ret*_*nuH 16 amazon-emr elastic-map-reduce emr hadoop-yarn apache-spark

我在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已经获取了所有新节点,但只将其中一个分配给了Spark作业.Spark成功地接收了新节点,并将其用作执行器,但我的问题是为什么YARN让其他7个节点闲置?

由于显而易见的原因,这很烦人 - 即使它们没有被使用,我也必须为资源付费,而我的工作根本没有加速!

有人知道YARN如何决定何时添加节点来运行火花作业?什么变量发挥作用?记忆?V-核心?什么?

提前致谢!

ret*_*nuH 19

好的,在@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"
        }
    } 
]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我是唯一一个得到错误的人吗?执行人数必须是正数? (2认同)
  • 我试过: { "Classification": "spark-defaults", "Properties": { "spark.dynamicAllocation.enabled": "true", "spark.executor.instances": "0" } 但它未能启动spark会话说执行者的数量应该是非零的正数。可以让我知道它是否对你有用? (2认同)