1、首先我们编写完类打成jar包提交到集群上,然后用spark-submit提交任务。提交任务可以分为集群和本地模式(集群:spark-submit --master spark://master:7077 --class 全类名 jar包路径 需要的参数)(本地:spark-submit --class 全类名 jar包路径 需要的参数)
2、spark-submit脚本会自己去调用SparkSubmit类,appArgs.action根据模式匹配判断是哪种方式提交的然后去执行对应的代码。
3、通过调用runmain方法去反射拿到我们要执行的类和方法去执行
4、首先SparkContext会去创建DAGScheduler和TaskScheduler
5、Transformation是懒执行的当我们的程序碰到Action算子的时候才会去saveAsHadoopDataset中调用runjob方法利用submitJob去DAGSchedulerEventProcessLoop线程池中提交job这时开始构造Stage,先拿到最后一个RDD(finalRdd),创建ResultStage(只存在一个),之后的Stage会根据宽窄依赖去切分Stage(都叫做ShuffleMapStage),Stage的切分是从后往前的,但是提交是从前往后的。
6、一个Stage中都是窄依赖,可以并行的去计算。根据你的分区数量开始划分任务。把相同处理逻辑但是数据不同的Task封装成一个TaskSet调用makeOffers去启动Task,交给TaskScheduler
7、客户端的Driver向Master注册
8、Master会根据自己的资源调度算法去让Worker启动一个或者多个Exeuctor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程
9、ExecutorBackend启动后会向Driver的SchedulerBackend注册,每个Stage包含的Task通过TaskScheduler分配给Executor执行
10、所有stage都完成后作业结束。
努力到无能为力,拼搏到感动自己