bms*_*cho 6 hadoop-yarn apache-spark
我在客户端模式下在 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 \
Run Code Online (Sandbox Code Playgroud)
运行此应用程序时,Spark UI 的 Executors 页面显示 1 个驱动程序和 4 个执行程序(总共 5 个条目)。我预计有 5 个执行者,而不是 4 个。同时,YARN UI 的 Nodes 选项卡显示在实际未使用的节点上(至少根据 Spark UI 的 Executors 页面...)分配了一个容器,使用 9GB 内存。其余节点上运行有容器,每个容器有 11GB 内存。
因为在我的 Spark Submit 中,驱动程序的内存比执行程序少 2GB,所以我认为 YARN 分配的 9GB 容器是为驱动程序分配的。
为什么要分配这个额外的容器?我怎样才能防止这种情况?
火花用户界面:
纱线用户界面:
我错误地假设 AM 将在主节点上运行,并且它将包含驱动程序应用程序(因此设置 spark.yarn.am.* 设置将与驱动程序进程相关)。
所以我做了以下更改:
spark.yarn.am.*设置设置为默认值(512m内存,1核)spark.driver.memory8g由于默认设置下的 AM 占用 512m + 384m 的开销,因此其容器适合工作节点上空闲的 1GB 可用内存。Spark 获取它请求的 5 个执行程序,并且驱动程序内存适合 8g 设置。现在一切都按预期进行。
火花用户界面:
纱线用户界面:
为YARN 应用程序 master分配了额外的容器:
在客户端模式下,驱动程序运行在客户端进程中,应用程序主机仅用于向YARN请求资源。
即使在客户端模式下驱动程序在客户端进程中运行,YARN application master 仍然在 YARN 上运行并且需要容器分配。
无法阻止 YARN 应用程序主机的容器分配。
作为参考,之前提出过类似的问题:Resource Allocation with Spark and Yarn。
| 归档时间: |
|
| 查看次数: |
2192 次 |
| 最近记录: |