【发布时间】:2019-01-06 00:37:10
【问题描述】:
我在客户端模式下在 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 容器是给驱动程序的。
为什么要分配这个额外的容器?我怎样才能防止这种情况发生?
火花用户界面:
纱线用户界面:
Igor Dvorzhak 回答后更新
我错误地假设 AM 将在主节点上运行,并且它将包含驱动程序应用程序(因此设置 spark.yarn.am.* 设置将与驱动程序进程相关)。
所以我做了以下更改:
- 将
spark.yarn.am.*设置设为默认值(512m 内存,1 个核心) - 通过
spark.driver.memory设置驱动内存为8g - 根本没有尝试设置驱动内核,因为它只对集群模式有效
因为默认设置下的 AM 占用 512m + 384m 的开销,所以它的容器适合工作节点上的 1GB 空闲内存。 Spark 得到它请求的 5 个执行器,驱动内存适合 8g 设置。现在一切正常。
火花用户界面:
纱线用户界面:
【问题讨论】: