Spark内核架构--清晰图解

详细步骤:
1.提交的jar包
2.spark-submit提交到集群上运行
3.在提交的机器上,运行sparkSubmit的main方法(通过反射的方式创建我们编写主类的实例对象,调用main方法,执行代码)
4.当代码到SparkContext,开始初始化SparkContxt
5.初始化SparkContext,创建DAGscheduler,TaskScheduler
6、当TaskSchedule启动后,会将用户提交的任务和相关的参数,提交给master进行任务的注册
7、当master接受到任务请求时,会将请求参数进行解析,并封装成Application,然后将其持久化,然后将其加入到任务队列waitingApps中
8、当轮到我们提交的任务运行时,就开始调用schedule(),进行任务资源的调度
9、master将调度好的资源封装到launchExecutor中发送给指定的worker
10、worker接受到Maseter发送来的launchExecutor时,会将其解压并封装到ExecutorRunner中,然后调用这个对象的start(), 启动Executor
11、Executor启动后会向DriverActor进行反向注册
12、TaskScheduler发送注册成功的消息给Executor
13、Executor接受到注册成功的消息后会创建一个线程池,用于执行TaskScheduler发送过来的task任务
14、当属于这个任务的所有的Executor启动并反向注册成功后,就意味着运行这个任务的环境已经准备好了,driver会结束SparkContext对象的初始化,也就意味着new SparkContext这句代码运行完成
15、当初始化sc成功后,driver端就会继续运行我们编写的代码,然后开始创建初始的RDD,然后进行一系列转换操作,当遇到一个action算子时,也就意味着触发了一个job
16、Driver会将这个job提交给DAGScheduler
17、DAGScheduler将接受到的job,根据stage划分算法划分一个个的stage,然后每个stage都封装成taskSet,并提交给TaskScheduler
18、TaskScheduler接受到DAGScheduler发送过来的task,会拿到一个序列化器,对task进行序列化,然后将序列化好的task封装到launchTask中,然后将launchTask发送给指定的Executor
19、Executor接受到了TaskScheduler发送过来的launchTask时,会拿到一个反序列化器,对launchTask进行反序列化,封装到TaskRunner中,然后从Executor这个线程池中获取一个线程,将反序列化好的任务中的算子作用在RDD对应的分区上
系统性的步骤:
1.Application(Spark程序)
通过spark-submit提交,submit会创建DriverActor进程执行Spark程序
2.到SparkConf,SparkContext会构造出DAGScheduler和TaskScheduler(进程),TaskScheduler向Master注册Application
3.Master用自己的资源调度算法(第8步),在Worker上启动Executer,启动之后会对TaskScheduler反注册(其中的SparkDeploySchedulerBacked)
4.Executor反向注册完(SparkContext准备完成),继续执行编写的代码
5.每执行到一个action会创建一个job-->提交给DAGScheduler。将job划分成多个stage(stage划分算法(17步)),每个stage创建TaskSet,交给TaskSchedule
6.TaskSchedule将tesk提交到Executor(task分配算法(18步)),Executor线程池取出一个执行一个task。一直执行ShuffleMapTask,最后一个执行ResultTask