文章地址:http://www.haha174.top/article/details/251403
前10篇主要介绍到了spark action,算子等一些简答的demo 操作。那么那些操作是怎么在spark 中运行的呢。下面将进行逐步的介绍。
图解:
说明:
1.首先会将编写的程序jar包上传到有spark 客户端的机器上通过spark-submit提交到集群上面取运行。这个jar 在spark 中有个专有名词叫Application.
2.通过spark-submit 提交的方式。之前的那种提交模式叫做standalone,其实会通过反射的方式,创建个构造出一个DriverActor进程出来.就叫他Driver.
3.Driver进程回去执行Application,也就是取执行我们编写的代码。回顾一下之前编写的spark 应用。先构造Sparkconf,在构造SparkContext.。 SparkContext在初始化的时候做的最重要的两件事就是构造出来DAGScheduler和TaskScheduler.
4.TaskScheduler 在构造TaskScheduler的时候,会去连接spark集群中的master节点。向master节点注册application.
5.master接受到application的注册请求后会使用自己的资源调度算法(后面会介绍)在spark集群的worker为这个application启动一个或者多个Executer.
6.worker会为了Application启动一个或者多个Executer。
7.Executer启动之后会自己反向注册到TaskScheduler上。这样TaskScheduler就知道服务于这个Application的Executer有那些了
8.所有当前Application 的Executer都反向注册到TaskScheduler上之后,Driver结束SparkContext的初始化,去执行编写的代码。
9.每执行到一个action操作时,就会创建一个job.job会提交给DAGScheduler
10.DAGScheduler 会将job划分成多个stage(Stage划分算法后面会介绍).然后为每一个stage创建一个TaskSet.
11.每一个TaskSet会提交给TaskScheduler。TaskScheduler会将TaskSet中每一个task提交到Executer中执行(task分配算法会在后面介绍)
12.Executer每接受到一个task.都会用TaskRunner来封装task.然后从线程池中取出一个线程来执行这个task.
13.TaskRunner将编写的代码,也就是要执行的算子以及函数,拷贝,反序列化。然后执行task.
14.Task 有两种一种是ShuffleMapTask和ResultTask.只有最后一个Stage是ResultTask其他都是ShuffleMapTask。
15.所以最后整个spark程序应用的执行。就是stage分批次作为tasker提交到Executer中执行,每个task针对RDD的一个partition.执行我们定义的算子和函数。
16依次类推知道所有操作执行完。