spark 内置TaskScheduler级别的调度算法,分别是队列与公平,默认是队列方式。具体源码可参考SchedulableBuilder
准确来讲spark有两层公平,一层是公平调度,一层是公平算法,如此便可使用公平调度+公平算法 或 公平调度+队列算法
公平调度方面,spark的多队列设置在standlong模式下则是较为鸡肋,原因在于没有动态选择队列执行任务的权利,同时公平调度仅仅是单应用下产物,故此设置多队列则也无法发挥其优势,使用配置文件设置则无法得到应用。如利用spark长生命周期管理的程序,不断提交任务,则可以于代码级进行控制(我是选择如此控制,效果也较为明显,但硬代码依然要编写一小部分),参考如下代码,每次仅仅一个固定的poolName。
sc.setLocalProperty("spark.scheduler.pool", "系统1")
终究使用原生态的spark的同学较多,故此会显得公平调度有些鸡肋,其实不然,相对FIFO模型的默认使用POOL的方式讲,其实FAIR已有对POOL调用做了部分的优化,可以同时执行数个独立stage。
FIFO:
override def addTaskSetManager(manager: Schedulable, properties: Properties) {
rootPool.addSchedulable(manager)
}
POOL:
/* 添加Schedulable */
override def addSchedulable(schedulable: Schedulable) {
require(schedulable != null)
schedulableQueue.add(schedulable)
schedulableNameToSchedulable.put(schedulable.name, schedulable)
schedulable.parent = this
}
FAIR:
/** 添加TaskSetManager,决定具体执行pool
* @param manager TaskSetManager
* @param properties sparkContext 内置配置文件 */
overridedef addTaskSetManager(manager: Schedulable, properties: Properties) {
var poolName = DEFAULT_POOL_NAME
var parentPool = rootPool.getSchedulableByName(pool