在上一篇中,咱们晓得了每个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端。