【发布时间】:2016-02-01 04:22:09
【问题描述】:
我有一个包含 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 作业:
- --驱动内存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 仅使用 Memory,而 DominantResourceCalculator 使用显性资源来比较多维资源,例如 Memory、CPU 等。"
然后我将该值更改为DominantResourceCalculator。
但是当我重新启动 YARN 并运行相同的 Spark 应用程序时,我仍然得到相同的结果,比如集群指标仍然告诉 VCores used 是 4!我还使用 htop 命令检查了每个节点上的 CPU 和内存使用情况,我发现没有一个节点将所有 10 个 CPU 内核完全占用。可能是什么原因?
我还尝试以细粒度的方式运行相同的 Spark 作业,例如使用 --num executors 40 --executor-cores 1,通过这种方式我再次检查了每个工作节点上的 CPU 状态,并且所有 CPU 内核都已完全占用。
【问题讨论】:
-
您能否在 Spark UI 网站(选项卡环境)上检查所有配置选项是否已真正传播到 Spark 应用程序?如果分配有任何问题,您也可以查看 YARN 资源管理器日志。
-
你解决过这个问题吗?我现在遇到了同样的问题。