Spark客户端模式-YARN为驱动程序分配了一个容器吗?

时间:2018-07-29 16:46:46

标签: apache-spark yarn

我在客户端模式下的YARN上运行Spark,因此我希望YARN仅为执行程序分配容器。但是,从我所看到的情况来看,似乎还为驱动程序分配了一个容器,而我得到的执行程序却没有我期望的那么多。

我正在主节点上运行spark提交。参数如下:

sudo spark-submit --class ... \
    --conf spark.master=yarn \
    --conf spark.submit.deployMode=client \
    --conf spark.yarn.am.cores=2 \
    --conf spark.yarn.am.memory=8G  \
    --conf spark.executor.instances=5 \
    --conf spark.executor.cores=3 \
    --conf spark.executor.memory=10G \
    --conf spark.dynamicAllocation.enabled=false \

在运行此应用程序时,Spark UI的“执行程序”页面显示1个驱动程序和4个执行程序(总共5个条目)。我希望有5个执行者,而不是4个执行者。 同时,YARN UI的“节点”选项卡显示在未实际使用的节点上(至少根据Spark UI的“执行器”页面...),分配了一个容器,使用9GB的内存。其余节点上运行着容器,每个容器11GB的内存。

因为在我的Spark Submit中,驱动程序的内存比执行程序少2GB,所以我认为YARN分配的9GB容器用于驱动程序。

为什么要分配这个额外的容器?我该如何预防?

Spark UI:

Spark UI's Executor tab

纱线UI:

YARN UI's Nodes tab


在Igor Dvorzhak回答后更新

我错误地假设AM将在主节点上运行,并且它将包含驱动程序应用程序(因此,设置spark.yarn.am。*设置将与驱动程序进程相关)。

因此,我进行了以下更改:

  • spark.yarn.am.*设置为默认设置(512m内存,1核)
  • 通过spark.driver.memory将驱动程序内存设置为8g
  • 根本不尝试设置驱动程序核心,因为它仅对集群模式有效

由于默认设置下的AM占用512m + 384m的开销,因此其容器可容纳工作节点上1GB的备用空闲内存。 Spark会获取它请求的5个执行程序,并且驱动程序内存适合8g设置。现在一切正常。

Spark UI:

Spark UI's Executor tab

纱线UI:

enter image description here

2 个答案:

答案 0 :(得分:1)

YARN application master分配了额外的容器:

  

在客户端模式下,驱动程序在客户端进程中运行,应用程序主控仅用于从YARN请求资源。

即使在客户端模式下驱动程序在客户端进程中运行,YARN应用程序主服务器仍在YARN上运行,并且需要分配容器。

无法阻止为YARN应用程序主服务器分配容器。

作为参考,前段时间提出了类似的问题:Resource Allocation with Spark and Yarn

答案 1 :(得分:0)

您可以如下指定spark提交中的驱动程序内存和执行程序数。

spark-submit --jars ..... --master yarn --deploy-mode cluster --driver-memory 2g --driver-cores 4 --num-executors 5 --executor-memory 10G- executor-cores 3

希望它对您有帮助。