Spark作业池内Fair与FIFO调度模式的差异探究
Spark作业池Fair与FIFO调度模式的差异及你遇到的"行为一致"原因
嘿,我之前也纠结过这个问题!刚好对Spark调度这块有点研究,来给你掰扯清楚~
一、先搞懂全局层面的核心差异
首先得区分全局调度模式和单个池内的调度模式:
- FIFO调度(全局):完全是"先到先得"的排队逻辑,不管后面的作业多小,只要前面的大作业没跑完,后面的就只能等着,哪怕集群还有空闲资源也不会分配。适合作业优先级明确、不需要资源共享的场景。
- Fair调度(全局):会把资源按权重公平分配给不同的调度池,每个池拿到自己的资源份额后,再调度池内的作业。这样能避免大作业把所有资源占完,小作业长期阻塞的情况。
二、为什么单个池内设置两种模式看起来没区别?
你提到在fairscheduler.xml里给单个池配置Fair或FIFO后,测试下来行为一致,这其实是Spark FairScheduler的算法逻辑导致的——单个池内的任务,在Fair调度算法下会因为参数一致,退化成类似FIFO的表现。
你看的源码逻辑没错:当两个任务属于同一个调度池时,它们的minShare(池的最小资源共享数)、weight(池的权重)都是完全相同的,而runningTask是整个池的运行任务数,对单个任务来说也没有差异。这时候Fair算法计算出来的任务优先级得分完全一样,Spark就会默认按任务的提交顺序来调度——这和FIFO模式的行为就完全重合了。
再加上如果你的测试场景是:
- 池内每次只跑一个任务;
- 集群资源足够,单个任务能占满所有可用资源;
那不管是Fair还是FIFO模式,任务都是按提交顺序依次执行,自然看不出差异。
三、什么时候能看出单个池内两种模式的区别?
要看到差异,你需要满足两个条件:
- 同一个调度池内同时有多个任务在等待执行;
- 集群的资源不足以让一个任务独占所有资源。
举个实际例子:假设你的集群有4个CPU核,给目标池设置为Fair模式,同时提交两个都需要2核的任务。这时候Spark会给每个任务分配2核,让它们并行执行。但如果把池设置为FIFO模式,第一个任务会先抢占所有能拿到的资源(比如4核,如果它能利用的话),或者先占2核直到执行完成,第二个任务才会开始运行。
四、总结一下
- 全局层面,Fair和FIFO的差异非常明显,核心是多池之间的资源分配逻辑不同;
- 单个池内,只有当池内有多个任务且资源有限时,才能看出Fair(并行共享资源)和FIFO(排队执行)的差异;
- 你测试时没看到区别,大概率是测试场景的问题——要么任务数量少,要么资源足够,导致两种模式的调度表现一致。
内容的提问来源于stack exchange,提问作者Yi Steven
相关产品推荐
相关产品推荐

