我有一个包含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 Vcores Used . 但是,当我在Spark作业开始运行后检查同一个YARN集群页面时,只有 4 Vcores Used 和 4 Vcores 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 回答
Executors 每个 10 核心, 2 核心 Application Master = 42 当你有 40 vCores总数时请求核心 .
将执行程序核心减少到 8 并确保重新启动每个NodeManager
还要修改yarn-site.xml并设置以下属性:
我想知道相同但改变资源计算器对我有用 .
这是我设置属性的方式:
检查应用程序中的YARN UI分配了多少容器和vcores,更改容器的数量应该是执行程序1,vcores应该是:(executor-cores * num-executors)1 .
没有将YARN调度程序设置为FairScheduler,我看到了同样的事情 . 然而,Spark UI显示了正确数量的任务,表明没有任何错误 . 我的群集显示接近100%的CPU使用率,这证实了这一点 .
在设置FairScheduler之后,YARN资源看起来是正确的 .