Spark 客户端模式 - YARN 为驱动程序分配容器?

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 容器是为驱动程序分配的。

为什么要分配这个额外的容器?我怎样才能防止这种情况?

火花用户界面:

Spark UI 的“执行器”选项卡

纱线用户界面:

YARN UI 的“节点”选项卡


Igor Dvorzhak 回答后更新

我错误地假设 AM 将在主节点上运行,并且它将包含驱动程序应用程序(因此设置 spark.yarn.am.* 设置将与驱动程序进程相关)。

所以我做了以下更改:

  • spark.yarn.am.*设置设置为默认值(512m内存,1核)
  • 将驱动内存设置为spark.driver.memory8g
  • 根本没有尝试设置驱动程序核心,因为它仅对集群模式有效

由于默认设置下的 AM 占用 512m + 384m 的开销,因此其容器适合工作节点上空闲的 1GB 可用内存。Spark 获取它请求的 5 个执行程序,并且驱动程序内存适合 8g 设置。现在一切都按预期进行。

火花用户界面:

Spark UI 的“执行器”选项卡

纱线用户界面:

在此输入图像描述

Igo*_*hak 2

为YARN 应用程序 master分配了额外的容器:

在客户端模式下,驱动程序运行在客户端进程中,应用程序主机仅用于向YARN请求资源。

即使在客户端模式下驱动程序在客户端进程中运行,YARN application master 仍然在 YARN 上运行并且需要容器分配。

无法阻止 YARN 应用程序主机的容器分配。

作为参考,之前提出过类似的问题:Resource Allocation with Spark and Yarn