Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法
1、spreadOutApp尽量平均分配到每个executor上;
2、非spreadOutApp尽量在使用单个executor的资源。
源码分析
org.apache.spark.deploy.master.Master
1、首先判断,master状态不是ALIVE的话,直接返回
2、调度driver
3、 Application的调度机制(核心之核心,重中之重)
源码如下:
/*
*schedule()解决了spark资源调度的问题
*/
private def schedule() {
//首先判断,master状态不是ALIVE的话,直接返回
//也就是说,stanby master是不会进行application等资源调度的
if (state != RecoveryState.ALIVE) { return }
// First schedule drivers, they take strict precedence over applications
// Randomization helps balance drivers
//Random.shuffle的原理,大家要清楚,就是对传入的集合的元素进行随机的打乱
//取出了workers中的所有之前注册上来的worker,进行过滤,必须是状态为ALIVE的worker
//对状态为ALIVE的worker,调用Random的shuffle方法进行随机的打乱
val shuffledAliveWorkers = Random.shuffle(workers.toSeq.filter(_.state == WorkerState.ALIVE))
val numWorkersAlive = shuffledAliveWorkers.size
var curPos = 0
//首先,调度driver
//为什么要调度driver,大家想一下,什么情况下,会注册driver,并且会导致driver被调度
//其实 ,只有用yarn-cluster模式提交的时候,才会注册driver;因为standalone和yarn-client模式,都会在本地直接
//启动driver,而不会来注册driver,就更不可能让master调度driver了
//driver调度机制
//遍历waittingDrivers ArrayBuffer