我在客户端模式下在 YARN 上运行 Spark,因此我希望 YARN 仅为执行器分配容器。然而,从我所看到的来看,似乎还为驱动程序分配了一个容器,并且我没有得到与预期一样多的执行程序。
我正在主节点上运行 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 的 Executors 页面显示 1 个驱动程序和 4 个执行程序(总共 5 个条目)。我预计有 5 个执行者,而不是 4 个。
同时,YARN UI 的 Nodes 选项卡显示在实际未使用的节点上(至少根据 Spark UI 的 Executors 页面...)分配了一个容器,使用 9GB 内存。其余节点上运行有容器,每个容器有 11GB 内存。
因为在我的 Spark Submit 中,驱动程序的内存比执行程序少 2GB,所以我认为 YARN 分配的 9GB 容器是为驱动程序分配的。
为什么要分配这个额外的容器?我怎样才能防止这种情况?
火花用户界面:
YARN UI:
Igor Dvorzhak 回答后更新
我错误地假设 AM 将在主节点上运行,并且它将包含驱动程序应用程序(因此设置 spark.yarn.am.* 设置将与驱动程序进程相关)。
所以我做了以下更改:
- set the
spark.yarn.am.*
设置为默认值(512m内存,1核)
- 通过设置驱动程序内存
spark.driver.memory
to 8g
- 根本没有尝试设置驱动程序核心,因为它仅对集群模式有效
由于默认设置下的 AM 占用 512m + 384m 的开销,因此其容器适合工作节点上空闲的 1GB 可用内存。
Spark 获取它请求的 5 个执行程序,并且驱动程序内存适合 8g 设置。现在一切都按预期进行。
火花用户界面:
YARN UI:
额外的集装箱被分配给YARN应用大师 https://spark.apache.org/docs/latest/running-on-yarn.html#launching-spark-on-yarn:
在客户端模式下,驱动程序运行在客户端进程中,并且应用大师仅用于向 YARN 请求资源。
即使在客户端模式下驱动程序在客户端进程中运行,YARN application master 仍然在 YARN 上运行并且需要容器分配。
无法阻止 YARN 应用程序主机的容器分配。
作为参考,之前问过类似的问题:Spark 和 Yarn 的资源分配 https://stackoverflow.com/questions/51080595/resource-allocation-with-spark-and-yarn.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)