我有一个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 Total为40。这很好!
然后我在上面安装了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 Used和4Vcores 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