Spark-运行内幕

运行内幕

1.Driver创建DAGScheduler,TaskScheduler,在实例化过程中,注册当前程序给master,master接受注册,分配资源;一般情况下,当通过Action触发job,SparkContext会通过DAGScheduler来把job中的RDD构成的DAG划分为不同的Stage,每个Stage内部是一系列业务逻辑完全相同,处理数据不同的Tasks,构成TaskSet,而TaskScheduler和SchedulerBackend负责具体Task运行。
spark运行架构

2.Master:接受用户提交的程序并发送指令给Worker,为当前程序分配计算资源,每个worker所在的节点,默认为当前程序分配一个executor,executor通过线程池并发执行,Master通知worker按要求启动executor;通过Proxy为executorRunner进程启动executorBackend,通过TaskRunner来封装Task,然后从线程池获取一条,执行Task;最后一个Stage中Task为ResultTask产生Job结果
spark整体架构

相关名词

Client

客户端进程,负责提交作业到Master

Executor

真正执行作业的地方,一个集群一般包含多个Executor,每个Executor接收Driver的命令Launch Task,一个Executor可以执行一到多个Task。

Stage

一个Spark作业一般包含一到多个Stage

Task

一个Stage包含一到多个Task,通过多个Task实现并行运行的功能

DAGScheduler

实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。

TaskScheduler

实现Task分配到Executor上执行

Driver

一个Spark作业运行时包括一个Driver进程,也是作业的主进程,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。与执行器节点进行通信,执行器节点作为独立的java进程进行。
Driver对应SparkConf SparkContext
spark应用程序

作业执行

Driver运行在客户端

客户端启动后直接运行用户程序,启动Driver相关的工作:DAGScheduler和BlockManagerMaster等。 客户端的Driver向Master注册。 Master还会让Worker启动Exeuctor。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。 ExecutorBackend启动后会向Driver的SchedulerBackend注册。Driver的DAGScheduler解析作业并生成相应的Stage,每个Stage包含的Task通过TaskScheduler分配给Executor执行。 所有stage都完成后作业结束。

Driver(作业的master,负责作业的解析、生成stage并调度task到,包含DAGScheduler)运行在Worker

客户端提交作业给Master Master让一个Worker启动Driver,即SchedulerBackend。Worker创建一个DriverRunner线程,DriverRunner启动SchedulerBackend进程。 另外Master还会让其余Worker启动Exeuctor,即ExecutorBackend。Worker创建一个ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。 ExecutorBackend启动后会向Driver的SchedulerBackend注册。SchedulerBackend进程中包含DAGScheduler,它会根据用户程序,生成执行计划,并调度执行。对于每个stage的task,都会被存放到TaskScheduler中,ExecutorBackend向SchedulerBackend汇报的时候把TaskScheduler中的task调度到ExecutorBackend执行。 所有stage都完成后作业结束。

注意

一个应用对应多个job,一个action对应一个job
worker不会与master汇报资源,分配时已记录