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,说明分配结束。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。