Apache spark Spark客户端模式-纱线为驱动程序分配容器?

Apache spark Spark客户端模式-纱线为驱动程序分配容器?,apache-spark,yarn,Apache Spark,Yarn,我正在客户机模式下运行Spark on Thread,因此我希望Thread将只为执行者分配容器。然而,从我所看到的,似乎一个容器也被分配给了驱动程序,而且我没有得到我所期望的那么多执行者 我正在主节点上运行spark submit。参数如下: sudo spark-submit --class ... \ --conf spark.master=yarn \ --conf spark.submit.deployMode=client \ --conf spark.yar

我正在客户机模式下运行Spark on Thread,因此我希望Thread将只为执行者分配容器。然而,从我所看到的,似乎一个容器也被分配给了驱动程序,而且我没有得到我所期望的那么多执行者

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

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个遗嘱执行人。 同时,Thread UI的Nodes选项卡显示,在未实际使用的节点上(至少根据Spark UI的Executors页面…),分配了一个容器,使用9GB内存。其余节点上运行着容器,每个容器有11GB的内存

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

为什么要分配这个额外的容器?如何防止这种情况发生?

Spark用户界面:

纱线界面:


Igor Dvorzhak回答后更新 我错误地假设AM将在主节点上运行,并且它将包含驱动程序应用程序(因此设置spark.Thread.AM.*设置将与驱动程序进程相关)

因此,我做了以下更改:

  • spark.warn.am.*
    设置设置为默认值(512m内存,1芯)
  • 通过
    spark.driver.memory
    将驾驶员记忆设置为8g
  • 根本没有尝试设置驱动程序核心,因为它仅对群集模式有效
因为默认设置上的AM占用512m+384m的开销,所以它的容器可以容纳工作节点上的1GB空闲内存。 Spark获得它请求的5个执行器,并且驱动程序内存适合8g设置。现在一切正常

Spark用户界面:

纱线界面:


额外的容器分配给:

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

即使在客户机模式下,驱动程序在客户机进程中运行,但Thread应用程序主机仍在Thread上运行,需要分配容器

无法阻止为纱线应用程序主机分配容器


作为参考,您可以在spark submit中指定驱动程序内存和执行器数量,如下所示

spark提交--jars--主线程--部署模式群集--驱动程序内存2g--驱动程序核心4--执行器数量5--执行器内存10G--执行器核心3


希望对您有所帮助。

谢谢。我假设驱动程序仍然在AM进程中运行(如在集群模式下),只是AM在主节点上运行,而不是在工作节点上运行。这就是我设置AM内存和内核的原因,我认为这将是驱动程序过程。