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



我有一个Hadoop集群,有5个节点,每个节点有12个核心,32GB内存。我使用YARN作为MapReduce框架,所以我对YARN有以下设置:

  • yarn.nodemanager.resource.cpu vcores=10
  • yarn.nodemanager.resource.memory mb=26100

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

然后我在上面安装了Spark,并在yarn客户端模式下使用Spark shell。

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

  • --驱动程序内存20480m
  • --执行器内存20000m
  • --执行人数量4
  • --执行器核心10
  • --conf-spark.yarn.am.cores=2
  • --conf-spark.yarn.exexecutor.memoryOverhead=5600

我将--executor cores设置为10,将--num executors设为4。因此,从逻辑上讲,应该总共使用40个Vcores个Vcores Used4Vcores Total

我还发现capacity-scheduler.xml中有一个参数,叫做yarn.scheduler.capacity.resource-calculator:

用于比较计划程序中资源的ResourceCalculator实现。默认值,即DefaultResourceCalculat器只使用内存,而显性资源计算器使用显性资源来比较多维资源,如内存、CPU等。

然后我将该值更改为DominantResourceCalculator

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

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

我也有同样的想法,但更改资源计算器对我来说很有效。
这就是我设置属性的方式:

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

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

在没有将YARN调度器设置为FairScheduler的情况下,我看到了同样的情况。不过,Spark UI显示了正确数量的任务,表明没有任何问题。我的集群显示接近100%的CPU使用率,这证实了这一点。

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

执行程序各取10个核心,应用程序主程序=42当您总共有40vCores时请求的核心为2

将执行器内核减少到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

相关内容

  • 没有找到相关文章

最新更新