我在客户端模式下的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:
纱线UI:
我错误地假设AM将在主节点上运行,并且它将包含驱动程序应用程序(因此,设置spark.yarn.am。*设置将与驱动程序进程相关)。
因此,我进行了以下更改:
spark.yarn.am.*
设置为默认设置(512m内存,1核)spark.driver.memory
将驱动程序内存设置为8g 由于默认设置下的AM占用512m + 384m的开销,因此其容器可容纳工作节点上1GB的备用空闲内存。 Spark会获取它请求的5个执行程序,并且驱动程序内存适合8g设置。现在一切正常。
Spark UI:
纱线UI:
答案 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
希望它对您有帮助。