乐趣区

关于spark:Spark-Task的资源分配

在上一篇中,咱们晓得了每个 stage 会依据分区数,把数据进行切分,并生成 Task,也就是说,有多少个分区数,就有多少个 Task,这些 task 会封装在 TaskSet 中。咱们持续上篇的流程,从 stage0 开始。
stage0 有 4 个分区,上面是 stage0 对应的 TaskSet 0.0,TaskSet 0.0 里有 4 个 Task。

TaskSet 0.0 提交后,会封装成 TaskSetManager,这个 TaskSetManager 是 Schedulable 类型的。最初扔到资源池里,这个资源池默认是 FIFO,先进先出,所以前面就会依照这个程序来把 TaskSetManager 取出来。

而后让调度后端给 Task 分配资源并运行 Task,以后线程持续往资源池扔 TaskSetManager(我这里只画了两个,实际上会把 stage2、stage3、stage4 顺次扔进来)。

调度后端接管到申请后,就会看看本人有哪些资源,如果是 local 模式,就间接创立一个 WorkerOffer,如果是 Standalone 模式,他就会看看本人有多少个闲暇的 Executor,从而创立对应的 WorkerOffer 个数。
如果申请到资源,就会把 task 封装成 TaskDescription,交给 Executor 去执行。Executor 外部也有一个线程池,他收到 TaskDescription 后,封装成 TaskRunner,扔到线程池中。
下图中,右边是 driver 端,左边是 Executor 端。此时才把数据发到 Executor。

Executor 线程池的线程,解决玩 task 后,把工作发回到 driver 端。

退出移动版