YARN 页面显示队列还有容量,作业却长时间处于 ACCEPTED,或者 ApplicationMaster 已经启动、后续 Container 一直拿不到。遇到这种情况,只看“队列使用率 70%”往往不够。
调度器分配的不是一个抽象百分比,而是落到具体节点上的一组资源。任务要申请 8 GB 内存和 4 个 vCore,某个节点只剩 16 GB 内存但只有 2 个 vCore,这个节点对它仍然不可用。把所有节点的空闲内存相加,看起来还有很多容量,也不代表存在一个能容纳当前请求的节点。
还有一个更容易忽略的前提:CapacityScheduler 使用哪个 ResourceCalculator。Hadoop 3.3.0 默认的计算器只比较内存,切换到 DominantResourceCalculator 后,内存与 CPU 才以多维资源参与比较。两种模式下同一个“50% 队列”的含义并不完全相同。