在上一篇中,我们知道了每个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端。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。