Apache spark Spark客户端模式-纱线为驱动程序分配容器?
我正在客户机模式下运行Spark on Thread,因此我希望Thread将只为执行者分配容器。然而,从我所看到的,似乎一个容器也被分配给了驱动程序,而且我没有得到我所期望的那么多执行者 我正在主节点上运行spark submit。参数如下: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
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.*设置将与驱动程序进程相关) 因此,我做了以下更改:
- 将
设置设置为默认值(512m内存,1芯)spark.warn.am.*
- 通过
将驾驶员记忆设置为8gspark.driver.memory
- 根本没有尝试设置驱动程序核心,因为它仅对群集模式有效
额外的容器分配给: 在客户机模式下,驱动程序在客户机进程中运行,应用程序主程序仅用于从应用程序请求资源 即使在客户机模式下,驱动程序在客户机进程中运行,但Thread应用程序主机仍在Thread上运行,需要分配容器 无法阻止为纱线应用程序主机分配容器
作为参考,您可以在spark submit中指定驱动程序内存和执行器数量,如下所示 spark提交--jars--主线程--部署模式群集--驱动程序内存2g--驱动程序核心4--执行器数量5--执行器内存10G--执行器核心3
希望对您有所帮助。谢谢。我假设驱动程序仍然在AM进程中运行(如在集群模式下),只是AM在主节点上运行,而不是在工作节点上运行。这就是我设置AM内存和内核的原因,我认为这将是驱动程序过程。