You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataProc YARN UI中Vcores显示异常问题排查咨询

Dataproc集群YARN Vcores显示异常问题解答

问题背景

我在由4台n1-standard-16机器(3台主节点、1台从节点)组成的Dataproc集群上运行Spark应用。空闲状态下,YARN UI显示可用Vcores为16,符合预期;但Spark应用运行时,Vcores显示超过16,达到32。已将YARN调度器改为公平调度器,Spark提交参数如下:

--properties=spark.submit.deployMode=cluster,spark.hadoop.hive.exec.dynamic.partition=true,spark.sql.hive.convertMetastoreOrc=true,spark.hadoop.hive.exec.dynamic.partition.mode=nonstrict,spark.shuffle.service.enabled=true,spark.dynamicAllocation.enabled=true,spark.dynamicAllocation.minExecutors=30,spark.dynamicAllocation.maxExecutors=180,spark.dynamicAllocation.executorIdleTimeout=60s,spark.executor.instances=70,spark.executor.cores=3,spark.serializer=org.apache.spark.serializer.KryoSerializer,spark.sql.shuffle.partitions=220,spark.executor.memory=3g,spark.driver.memory=2g,spark.yarn.executor.memoryOverhead=1g

一、Vcores显示超标的原因

  • 主节点资源未被限制:Dataproc默认允许主节点运行YARN NodeManager,参与资源调度。你的3台主节点每台都是n1-standard-16(16核),空闲时主节点的NodeManager可能未被分配任务,YARN UI只显示从节点的16可用核;但Spark应用运行时,YARN会调度主节点的空闲资源,导致总使用Vcores突破16。
  • Spark配置冲突导致资源申请虚高:你同时设置了spark.executor.instances=70和动态分配,这个固定实例数远超过集群实际能承载的容量(按每Executor3核算,集群总核数若为3*16+16=64,最多只能跑21个左右Executor)。YARN UI显示的是Spark申请的资源量,而非实际运行的资源量,所以会出现Vcores显示32的情况。另外spark.dynamicAllocation.maxExecutors=180也远超集群承载能力,进一步加剧了资源申请的虚高。

二、是否与线程机制有关?

无关。Spark的Executor线程是在YARN分配的Vcores内部复用的,spark.executor.threads(默认等于spark.executor.cores)控制的是单个Executor内的线程数,这些线程不会额外占用YARN的Vcores。问题核心是YARN资源调度配置与集群实际资源不匹配,以及主节点资源的参与调度。

三、如何控制Vcores显示异常?

  • 限制主节点的YARN资源:如果不需要主节点参与计算,修改YARN配置,将主节点的yarn.nodemanager.resource.cpu-vcores设为0,让YARN只使用从节点的16核资源。在Dataproc中可以通过集群初始化动作或后期修改配置文件实现。
  • 修正Spark提交参数:
    • 删除spark.executor.instances=70:开启动态分配后,该参数会被动态分配逻辑覆盖,且数值远超集群容量,导致资源申请异常。
    • 调低spark.dynamicAllocation.maxExecutors:根据集群实际核数计算,比如仅用从节点16核,每个Executor3核,最大Executor数设为5(16/3≈5);若允许主节点参与,再按主节点可用核数调整。确保spark.executor.cores * maxExecutors不超过集群总可用Vcores。

四、如何最大化利用集群资源?

  • 合理利用主节点资源:如果主节点有空闲资源,可以保留主节点的NodeManager,调整yarn.nodemanager.resource.cpu-vcores为预留服务后的剩余核数(比如主节点留4核给HDFS、YARN RM等,剩下12核分配给NodeManager),让主节点参与计算,提升集群总资源利用率。
  • 优化Spark参数配置:
    • 根据节点规格调整Executor资源:n1-standard-16有60GB内存,从节点扣除YARN overhead后,可将spark.executor.memory调高(比如10GB),配合spark.executor.cores=3,让单节点能运行5个Executor,充分利用节点的核和内存。
    • 避免参数冲突:开启动态分配后,不要设置固定的spark.executor.instances,让YARN根据任务负载自动增减Executor。
    • 调整shuffle分区数:将spark.sql.shuffle.partitions设为接近Executor数量 * Executor核数的倍数(比如5*3=15,设为15或30),提升shuffle性能。
  • 优化公平调度器配置:针对不同任务配置队列权重,确保重要任务获得足够资源,同时避免单个任务独占集群资源,提升整体资源利用率。

内容的提问来源于stack exchange,提问作者Aravind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:15:31