共计 2067 个字符,预计需要花费 6 分钟才能阅读完成。
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- 资源调度