为什么vcore总是等于YARN上Spark中的节点数?

时间:2015-11-01 00:33:41

标签: apache-spark yarn

我有一个包含5个节点的Hadoop集群,每个节点有12个内核,32GB内存。我使用YARN作为MapReduce框架,因此我对YARN进行了以下设置:

  • yarn.nodemanager.resource.cpu-vcores = 10
  • yarn.nodemanager.resource.memory-MB = 26100

然后,我的YARN群集页面(http://myhost:8088/cluster/apps)上显示的群集指标显示 VCores Total 40 。这很好!

然后我在它上面安装了Spark并在yarn-client模式下使用spark-shell。

我使用以下配置运行了一个Spark作业:

  • - driver-memory 20480m
  • - executor-memory 20000m
  • - num-executors 4
  • - executor-cores 10
  • - conf spark.yarn.am.cores = 2
  • - conf spark.yarn.executor.memoryOverhead = 5600

我将 - executor-cores 设为 10 - num-executors 4 ,所以从逻辑上讲,应该完全 40 Vcor​​es Used 。但是,当我在Spark作业开始运行后检查相同的YARN群集页面时,只有 4 Vcor​​es Used 4 Vcor​​es Total

I also found capacity-scheduler.xml中有一个参数 - 名为yarn.scheduler.capacity.resource-calculator

  

" ResourceCalculator实现,用于比较调度程序中的资源。默认值,即DefaultResourceCalculator仅使用内存,而DominantResourceCalculator使用显性资源来比较多维资源,如内存,CPU等。"

然后我将该值更改为DominantResourceCalculator

但是当我重新启动YARN并运行相同的Spark应用程序时,我仍然得到相同的结果,说集群指标仍然告诉我使用的VCores是4!我还使用htop命令检查了每个节点上的CPU和内存使用情况,我发现没有一个节点完全占用了所有10个CPU核心。可能是什么原因?

我还尝试以细粒度的方式运行相同的Spark作业,比如使用--num executors 40 --executor-cores 1,这样我再次检查每个工作节点上的CPU状态,并且所有CPU核心都已完全占用。

3 个答案:

答案 0 :(得分:1)

执行人员每个 10 核心, 2 核心应用程序主数据 = 42 当你有 40 vCores时,请求核心。

将执行程序核心减少到 8 并确保重新启动每个 NodeManager

同时修改yarn-site.xml并设置以下属性:

yarn.scheduler.minimum-allocation-mb
yarn.scheduler.maximum-allocation-mb
yarn.scheduler.minimum-allocation-vcores
yarn.scheduler.maximum-allocation-vcores

答案 1 :(得分:0)

我想知道同样的事情,但更改资源计算器对我有用。
这就是我设置属性的方式:

    <property>
        <name>yarn.scheduler.capacity.resource-calculator</name>      
        <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>       
    </property>

在应用程序中检查YARN UI分配了多少容器和vcores,更改容器的数量应为执行程序+ 1,vcores应为:(executor-cores * num-executors)+1。< / p>

答案 2 :(得分:0)

没有将YARN调度程序设置为FairScheduler,我看到了同样的事情。然而,Spark UI显示了正确数量的任务,表明没有任何错误。我的群集显示接近100%的CPU使用率,这证实了这一点。

设置FairScheduler后,YARN资源看起来是正确的。