1.application
2.spark-submit
3.Driver
4.SparkContext
5.Master
6.Worker
7.Executor
8.job
9.DAGScheduler
10.TaskScheduler
11.ShuffleMapTask and ResultTask
1.提交spark应用程序的机器,首选是我们把自己编写的程序也就是application提交到此机器上
2、spark-submit我们用此命令来提交自己的程序
3、Driver,我们通过spark-submit提交程序的时候,其实会通过反射的方式,创建和构造一个DriverActor进程出来。Driver进程会执行我们的代码。我们编码时会先创建sparkconf继而构造sparkcontext。Driver会调用我们的sparkcontext,而sparkcontext在创建的时候会构造DAGScheduler和TaskScheduler,TaskScheduler会通过他对应的一个后台进程会调用我们集群中的Master节点,向master注册Application.Master接收到application注册的请求之后,会试用中自己的资源调度算法,在spark集群的worker上,为这个application启动多个executor。一个master对应多个worker,一个worker对应多个executor。master通知worker启动executor。worker会为application启动executor。executor启动之后首先是在反向注册到taskSchuster。这样taskschduler就管理到了executor。所有executor都反向注册到driver上之后,driver结束sparkcontext初始化。会继续执行我们自己编写的代码。执行代码的时候每遇到一个action,就会创建一个job.job会提交给DAGScheduler.DAGScheduler会将job划分为多个stage,然后每个stage创建一个taskset。每个taskset会被分配给taskScheduler。taskscheduler会把taskset中的每一个task提交到之前注册到这个taskscheduler的executor上执行,executor每接收到一个任务,都会用taskRunner来封装task,然后从线程池里取出一个线程执行这个task。taskrunner将我们编写的算法以及函数拷贝反序列化执行task.task分为两种,shufflemaptask和resulttask,只有最后一个stage是resulttask,之前的stage都是shufflermaptask.所以最后整个spark应用程序的执行,就是stage分批次作为taskset提交到executor执行,每个task针对RDD的一个partiton,执行我们定义的算子和函数。以此类推,直到所以操作执行完为止。
这里面涉及到几个算法。master的资源调度算法、DAGscheduler划分stage的stage分配算法、TASKScheduler分配taskset的task分配算法。