1、通过Spark的脚本spark-submit初始化SparkContext
2、初始化SparkContext会初始化两个非常重要的对象DAGScheduler和TaskScheduler
3、当DAGScheduler和TaskScheduler创建成功后,会生成一个Application,注册到Master节点。Application中封装的是提交的各种参数(核数、内存等)以及所需要的的jar包。参考:./spark-submit --master xxx --executor-memeory xx --total-executor-cores xx
4、Master在接收到Driver端提交过来的Application后,会通过资源调度计算Application需要的资源,并将任务发送到Worker节点
5、Worker收到Master发来的任务请求,会启动Executor,里面封装的是各种资源
6、当Worker内的Executor启动完成,并且成功床架线程池后,集群的准备工作完成。会向Driver端反向注册,准确的说是想TaskScheduler注册。至此,SparkContext的初始化完成
7、此时开始执行任务,我们代码中没每遇到一个Action算子,都会触发一个job
8、将job划分为多个stage,通过stage的划分算法,进行阶段划分
9、划分完stage后,会在stage的内部提交task,通过TaskSet将task提交给TaskSceduler
10、TaskSceduler在接收到任务后,会将task分发到不同Executor执行
11、在提交过程中中,内部会通过本地化级别,对任务进行级别划分,共有5种级别
12、TaskRunner执行Task,以FIFO的模式进行任务调度
13、Task内部,会将Task分为两种:上游Task(MapTask)和下游Task(ReduceTask)