Spark-任务调度

目录

流程

在这里插入图片描述

   1.Soark中,咱们写的应用程序都是一个个RDD对象组成的。能够根据代码画出来一个DAG有向无环图,将DAG有向无环图交给DAG Scheduler;
   2.DAG Scheduler根据款窄依赖将DAG有有向无环图切割成一个个的stage,将切割出来的stage封装成另外一个对象TaskSet,TaskSet就是一个个的stage。而后DAG Scheduler将一个个的taskSet发送给TaskScheduler;
   3.Task Scheduler拿到TaskSet后,会遍历这个集合,拿到每个task,而后去调用HDFS上某一个方法获取数据的位置。依据数据的位置来分发Task到Worker节点的Executor进程中的线程池中执行;
   4.Task Scheduler会实时跟踪每个task的执行状况,若执行失败,Task Scheduler会重试提交task,不会无休止的重试,默认重试3次。若重试3次依然失败,那么这个task所在的stage就失败了;
   5.此时Task Scheduler会向DAG Scheduler汇报,当前stage是顾拜,此时DAG Scheduler会重试提交stage(每一次重试提交的stage,已经充公执行的不会再次分发到Executor进程执行,知识重试失败的);
   6.若是DAG Scheduler重试了4次依然失败,那么stage所在的job就失败了,job失败是不会进行重试的node

Q:什么是挣扎(掉队 )任务?
A:若是应用程序中有1W个task,其中有9999个已经运行成功,剩下1个task仍在运行,那么咱们认为这1个tasl就是挣扎任务。当Task Scheduler遇到挣扎的任务,它会重试,此时Task Scheduler会从新提交一个和挣扎的的tsk如出一辙的task到集群中运行(挣扎的task不会被kill掉),让两个task再集群中比赛执行,谁先执行完毕就以谁的结果为准。
web

Q:什么是推测执行机制?
A:标准:100ms,1.5,75%
      当全部的task的75%以上所有执行完毕,那么才会每隔100ms计算一次查看哪些task须要推测执行。
      若是应用程序中有100个task,已经有76个task执行完毕,还有24个正在运行,此时它会计算这24个task已经执行时间的中位数,而后将中位数*1.5=时间,用这个时间去查看哪一些task超时,此时这些task就是挣扎的task。
数据库

Q:若是1T数据,单击运行须要30min,可是使用Spark(4node)须要2h,为何?
A:1.计算发生了数据倾斜
      2.开启了推测执行机制
svg

Q:对于ETL(Extract Transform Load,数据清洗流程)类型的业务,开启推测执行、重试机制,对于最终的结果会不会有影响?
A:有影响,最终的数据库中会有重复数据。若是第一个task执行90%失败,第二个task执行成功,那么第一个task的数据也会插入到数据库中。
      解决方法:1.关闭各类推测、重试机制;
                        2.设置一张事务表。
线程