使用YARN与Fair Scheduler的Spark集群:单用户核心数受限问题排查
核心数限制的可能来源:YARN 全局配置与 Fair Scheduler 队列配置都有可能
这两种配置维度都可能导致你遇到的核心数上限问题,我结合实战排查经验给你拆解关键配置点和排查路径:
1. YARN 全局资源配置的限制
YARN的全局资源配额决定了整个集群能提供的核心总数,以下是核心配置项:
yarn.nodemanager.resource.cpu-vcores:单个NodeManager节点可分配的CPU核心数。如果你的集群有3个节点,每个节点设为6,那集群总核心就是18,自然所有任务加起来最多用18个核心。yarn.scheduler.maximum-allocation-vcores:单个应用程序能申请的最大核心数,不过如果是多个任务共享集群,这个配置不会直接限制总使用量,但如果全局总核心本身就是18,那所有任务的核心总和就到顶了。- 动态分配相关的MapReduce配置:
mapreduce.map.cpu.vcores和mapreduce.reduce.cpu.vcores分别控制单个Map/Reduce任务占用的核心数,如果每个任务占的核心多,同时运行的任务数就少,但总核心数还是受限于全局配额。
2. Fair Scheduler 队列级别的资源限制
Fair Scheduler是基于队列做资源调度的,队列的资源配额会直接限制该队列下所有任务的总核心使用量,关键配置在fair-scheduler.xml中:
maxResources:队列能使用的最大资源上限,比如如果你的队列配置了<maxResources>18 vcores</maxResources>,那不管集群有多少空闲核心,这个队列里的任务最多只能用18个核心,后续任务必须等核心释放才能运行。这是最常见的导致该问题的原因。minResources:队列的最小资源保障,不过这个是保障队列至少能拿到这么多资源,不会限制上限。weight:如果存在多个队列,权重低的队列可能会被Fair Scheduler分配更少的资源,但这种情况通常是和其他队列竞争资源,而不是固定卡在18核心,除非权重配置刚好让你的队列只能分到18核心。
快速排查步骤
- 查看YARN ResourceManager UI:打开RM的Web界面(默认端口8088),先看集群的
Total Vcores和Allocated Vcores。如果Total Vcores就是18,那问题出在YARN全局配置;如果Total远大于18,但你的队列只用到18,那就是Fair Scheduler的队列配置限制。 - 检查队列资源配额:在RM UI的
Schedulers标签下,找到你提交任务的队列,查看它的Max Resources数值,就能确认是不是队列配额限制了核心数。 - 核对配置文件:直接查看集群的
yarn-site.xml(YARN全局配置)和fair-scheduler.xml(Fair Scheduler队列配置),确认上述关键配置项的数值。
内容的提问来源于stack exchange,提问作者bhomass
相关产品推荐
相关产品推荐

