程序员->IDEA编写代码->jar包->放到集群计算->
提交spark应用程序的机器->shell中spark-submit脚本提交程序->运行Driver进程(client模式和提交机器相同)->new sparkContext对象->sparkContext在初始化的时候,会启动UI,设置spark的env,做的最重要的事情就是构造出一个TaskScheduler和一个DAGScheduler->
- TaskScheduler->负责它对应的一个后台进程,去连接Master,向Master注册这个Application->Master接收到Application注册过来的请求之后,会用资源调度的算法,在spark集群的Worker上为这个App启动多个Executor进程->Executor启动之后会反向注册到TaskScheduler上面来->所有Executor都反向注册到Driver上之后,Driver结束SparkContext初始化,会继续执行我们自己编写的代码。
- DAGScheduler -> Job的切分(action)->stage的切分(宽依赖)->生成包含多个task(pipeline)的taskSet->TaskScheduler将taskSet打散->TaskScheduler会(通过分配算法)把Taskset里面的每一个Task提交到Executor上去执行->Executor的线程去运行包含Task的TaskRunner
->总结,最后整个这个Spark应用程序的执行就是Stage分批次的做为Taskset提交到Executor里面执行,每个Task针对RDD的一个partition,执行我们的算子和函数,task并行执行。