1、Driver(核心是SparkContext)
1) SparkContext:创建DAGScheduler、TaskScheduler、SchedulerBackend,在实例化的过程中Register当前程序给Master、Master接受注册,如果没有问题,Master会为当前程序分配AppId并计算计算资源。
2) 一般情况下当通过action出发Job时SparkContext会通过DAGScheduler来把Job中的RDD构成的DAG划分成不同的Stage,每个Stage内部是一系列业务逻辑完全相同但是处理数据不同的Tasks,构成了TaskSet;TaskScheduler和SchedulerBackend负责具体Task的运行(遵循数据本地性)
2、Spark Cluster
1) Master:接受用户提交的程序并发送指令给Worker为当前程序分配计算资源,每个Worker所在节点默认为当前程序分配一个Executor,在Executor中通过线程池并发执行。
Master通知Worker按照要求启动Executor
2) Worker Node
Worker进程,通过一个Proxy为ExecuorRunner的对象实例来远程启动Executorbackend进程
ExecutorBackend进程,里面有Executor
实际在工作的时候会通过TaskRunner来封装Task,然后从ThreadPool中获取一条线程执行Task,执行完后线程被回收复用。
3、Task
最后一个Stage中Task称为ResultTask,产生Job的结果,其他前面的Stage中的Task都是ShuffleMapTask,为下一阶段的task做数据准备,相当于MapReduce中的Mapper。
4、过程
整个Spark程序的运行,就是DAGScheduler把Job划分成不同的Stage,提交TaskSet给TaskScheduler,进而提交给Executor执行(符合数据本地性),每个Task会计算RDD中的一个Partition,基于该Partition来具体执行我们定义的一系列同一个Stage内部的函数,以此类推。。直到整个程序完成。
Spark on yarn的过程:
Step1:Spark Yarn Client上传相关的Jar和资源到HDFS
Step2 : spark yarn client 向Resource Manager提交请求
Step3 :Resource Manager分配AppMaster 给Node Manager
Step4 :Node Manager 启动AppMaster
Step5 : AppMaster启动调度器DAG scheduler,同时向Resource Manager申请Container
Step6 :Resource Manager 分配Container给Node Manager
Step7 :Node Manager启动Container
Step8 :YarnClusterScheduler对 worker分配工作
Step9 : SparkWorker(Excecutor)从HDFS上读取分片数据