Master的资源调度是Spark的一级资源调度,分为对Driver的资源调度和对Executor的资源调度。这篇次要是讲Executor的资源调度。
咱们假如初始条件是这样的:
曾经5个Worker注册到Master,别离是4核16G(Dead),1核0.5G,4核4G,2核8G,4核8G。(这里的4核阐明的是残余的CPU核数,并不是服务器配置)

有2个Application注册到Master,队列第一个的Application的要求是,每个Executor要求1核1G,须要的总内核数是5。

流程

在开始调配的时候,就会过滤一下这些Worker,比方状态为Dead的,或者CPU内存不满足Application要求的1核1G,这些Worker都不能用。过滤后剩下的Worker再依照闲暇内核数倒序排列(排序是因为能够优先将利用调配给内核资源短缺的Worker),所以过滤并排序后如下:

排序后会建两个数组,一个是assignedCores记录每个Worker给Application调配的内核数的数组,另外一个是assignedExecutors记录每个Worker给利用调配的Executor数的数组,所以两个数组的长度就是筛选后的Worker的个数,这里两个数组的长度都为3。

这里调配的计划有两个,默认的是容许Application可能在所有节点间调度,会顺次从Worker上拿资源。

计划一

步骤1:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为1,assignedExecutors对应Worker1的地位赋值为1,阐明Worker1曾经被调配1核1G。同时Application的total改完4,阐明还须要4个内核。

步骤2:
Worker2调配1核1G进去,所以assignedCores对应Worker2的地位赋值为1,assignedExecutors对应Worker2的地位赋值为1,阐明Worker2曾经被调配1核1G。同时Application的total改完3,阐明还须要3个内核。

步骤3:
Worker3调配1核1G进去,所以assignedCores对应Worker3的地位赋值为1,assignedExecutors对应Worker3的地位赋值为1,阐明Worker3曾经被调配1核1G。同时Application的total改完2,阐明还须要2个内核。

步骤4:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为2,assignedExecutors对应Worker1的地位赋值为2,阐明Worker1曾经被调配2核2G。同时Application的total改完1,阐明还须要1个内核。

步骤5:
Worker2调配1核1G进去,所以assignedCores对应Worker2的地位赋值为2,assignedExecutors对应Worker2的地位赋值为2,阐明Worker2曾经被调配2核2G。同时Application的total改完0,阐明调配完结。

计划2

这个计划,就是使劲的往一个Worker上褥羊毛,直到他资源耗尽,才会换一个。
步骤1:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为1,assignedExecutors对应Worker1的地位赋值为1,阐明Worker1曾经被调配1核1G。同时Application的total改完4,阐明还须要4个内核。

步骤2:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为2,assignedExecutors对应Worker1的地位赋值为2,阐明Worker1曾经被调配2核2G。同时Application的total改完3,阐明还须要3个内核。

步骤3:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为3,assignedExecutors对应Worker1的地位赋值为3,阐明Worker1曾经被调配3核3G。同时Application的total改完2,阐明还须要2个内核。

步骤4:
Worker1调配1核1G进去,所以assignedCores对应Worker1的地位赋值为4,assignedExecutors对应Worker1的地位赋值为4,阐明Worker1曾经被调配4核4G。同时Application的total改完1,阐明还须要1个内核。

步骤5:
此时Worker1的CPU和内存曾经不满要求了,所以开始往Worker2要资源。
Worker2调配1核1G进去,所以assignedCores对应Worker2的地位赋值为1,assignedExecutors对应Worker2的地位赋值为1,阐明Worker2曾经被调配1核1G。同时Application的total改完0,阐明调配完结。

源码思维导图

master-资源调度