Spark1.3.0源码分析 第三篇 Master资源调度算法原理

原创
2017/06/16 13:16
阅读数 123

在上一篇说到Master注册机制,当我们在进行注册完以后都会去调用一个方法:schedule()

这个方法中封装Mester资源调度算发的基本原理。如图:

在这个方法中首先,会判断Master是否是ALIVE,如果不是直接返回,也就是说standby Master不对Application进行资源调度。接着就会对传入的元素的集合进行随机的打乱,取出workers中以前注册的worker,并且必须是ALIVE的worker,对状态为ALIVE的worker,进行随机的打乱。如图

接下来,就是进行资源的调度,其首先,对Driver的调度,即Driver调度机制

首先,是遍历waitingDriver Arraybuffer

在for循环中,又会通过while循环来遍历活着的worker,只要还有活着的worker就一直循环下去并且还要求当前Drive还是没有启动的,在while循环中有回去判断当前worker空闲cpu core 是否大于Diver的需求,当前worker空闲的内存空间是否大于Driver的需求。如果满足,则会通过launchDriver()方法去启动Driver。并将Driver从waitingDrvier中缓存队列中移除,将指针移向下一个worker,如图:

1)进入launchDriver()中进行分析

    在launchDriver()方法中,会将Driver加入到worker内存中,将Driver的内存和cup加入到worker内存和cup中,然后用worker的Actor,将launcDriver的消息发送到worker,让worker去启动Dirver,最后将worker的状态设为running。如图:

回到schedule()中,接下来就是Application资源调度机制 ,Application分为两种:SpreadOutApps与非SpreadOutApps。

1)spreadOutApps方式

在这种调度机制中,首先,遍历出waittingApps中的ApplicationInfo,并且过滤出还需要core的Application,然后,在for循环中从workers中状态为ALIVE的,再次过滤还可以被Application使用的worker,并对剩余的cpu数量进行倒叙排序。接着它会创建一个数组来存储要分配给worker的cpu 的数量,接着会获取总共需要分配的cpu core 的数量,即去Application 还需要的cup core的数量与worker总共还可以分配的cup core 的数量,来防止由于worker 空闲的CPU core  不够而超额分配的如图:

 

以上准备工作做完以后,接着就是开始分配资源了,在源码中,是通过while循环遍历来进行分配,条件就是toAssign>0,就是说只要还有没有分配完的cpu core 一直分配下去,接着进入到whlie里面中就可以知道,在while循环中,先是判断每个worker空闲的cup 数是否大于要分配的cup数量,如果大于,则将总共要分配的cpu -1,因为已经决定要调用这个worker了,并将给这个worker 分配的cpu 数量 +1,否则将指针移发下一个worker,如图:

在给worker 分配完每个Application需求cup 之后,遍历worker,在worker上启动Executor,并创建executorDesc对象,其中封装了给这个Executor分配了多少cup core,如图:

2) 非sprendOutApps方式

     这个算法刚好和sprendOutApps相反,它要求是尽量少的分配worker,比如总共有十个worker,每个有十个cup core ,app总共要分配二十个cup core,那么其实只会分配到两个worker上,每个worker占满十个cup core。首先,遍历worker,要求worker的状态是ALIVE,并且还有空闲 cpu core的worker,再遍历Application,并且是还需要的cup core的app,判断当前worker是否还可以被app使用,然后获取worker剩余的 cpu core和获取app还需要的cup core最小值,给app添加一个Executor,调用launchExecutor()方法,在worker启动一个Executor,将worker的状态修改为RUNNING,如图:

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部