天天看点

spark的任务调度流程(三)

spark任务调度

1、提交spark应用,每一个saprk的应用叫做application;

2、./bin/spark-submit 提交代码,启动driver;

3、启动driver也就意味着开始要执行代码,执行代码的时候初始化sparkContext,即构建DAGScheduler和TaskScheduler;

4、TaskScheduler向master注册,master接到请求之后,向worker申请Executor,接着worker为aplication启动多个Executor ;

5、Driver把Application信息注册给Master后Master会根据Application信息去Worker节点启动Executor;

6、executor启动完成以后,executor会反向driver去注册,然后driver就知道那些executor为这个application任务服务了,到这儿SparkContext完成了初始化操作,然后代码的执行能够每执行一个action操作,就会创建一个job任务,job任务提交给DAGScheduler,DAGScheduler会将job拆分成多个stage,每个stage创建以TaskSet集合;

7、DAGScheduler负责把spark作业转换成Stage的DAG[有向无环图],根据宽窄依赖切分Satge,然后把Stage封装成TaskSet的形式发送TaskScheduler,同时DAGScheduler还会处里由于shuffle数据跌势导致的失败;

8、TaskScheduler会把TaskSet里面每个task都市提交给executor去执行,【维护所有TaskSet,分发Task给各个节点的Executor,监控task的运行状态,负责重试失败的task】executor每收到一个Task,都会启动taskrunner去封装task,然后从线程池里取出一个线程来执行task:shuffleMaptask or ResultTask,最后一个stage里面都是reultTask,其余都是shuffleMapTask【task时针对里面的每一个partition执行我们定义好的算子操作;

9、所有task运行完成后,SparkContext向Master注释,释放资源;

spark关键术语:

master节点:常驻master进程,负责管理全部worker节点;

worker节点:常驻worker进程,负责管理executor并与master节点通信;

driver:用户自己编写的应用程序;

executor:每个工作节点上为应用启动的一个进程,该进程负责运行任务,并且将数据存在内存和磁盘上,每个job各自有独立的execcutor,主要职责:1、初始化程序要执行的上下问sparkEnv,解决应用程序需要运行的jar包的依赖、加载类2、汇报当前任务的状态【监控和执行器】;

job:多个task的并行计算,时RDD里面的action,每个action算子的执行会生成一个job,job->DAGScheduler->task/stage/;

stage:一个job会被拆分成多个task,每组任务被分为一个stage,stage分为shuffle和result如果多个job中有多次shuffle,每个shuffle之前都是一个stage,shuffle的算子有distict/reduceByKey/groupByKey/sortByKey/表关联join/重分区repartition or coalexce,增加分区提高并行

继续阅读