spark任务执行流程详细介绍之TaskScheduler和DagScheduler

standalone模式下:

提交spark-submit任务,会先在client端启动driver,driver就是我们写的spark程序,driver进程启动后,首先会构建sparkcontext,sparkcontext主要包含两部分:DAGScheduler和 TaskScheduler,然后TaskScheduler会寻找集群资源管理器(Master/Worker)的Master节点,Master节点接收到ApplicationMaster的注册请求后,通过资源调度算法,在自己的集群的worker上启动Executor进程,启动的executor也会反向注册到TaskScheduler(SchedulerBackend)上。Driver等待资源满足,执行main函数,Spark的查询为懒执行,当执行到 action 算子时才开始真正执行,开始反向推算,一个Action算子触发一个job,并交给DAGScheduler来处理。

DAGScheduler主要做两个部分的事情:

1、将1个job切分成多个stage。DAGScheduler会根据RDD的血缘关系构成的DAG从后往前,由最终的RDD不断通过依赖回溯判断父依赖是否是宽依赖,遇到一个shuffle就划分一个Stage,将一个Job划分为若干Stages。无shuffle的称为窄依赖,窄依赖之间的RDD被划分到同一个Stage中。划分的Stages分两类,一类叫做ResultStage,为DAG最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据。

2、将stage打包成Taskset提交。一个Stage如果没有父Stage,那么从该Stage开始提交,父Stage执行完毕才能提交子Stage。Stage提交时会将Task信息(分区信息以及方法等 一个Partition对应一个Task)序列化并被打包成TaskSet交给TaskScheduler,,另一方面TaskScheduler会监控Stage的运行状态,只有Executor丢失或者Task由于Fetch失败才需要重新提交失败的Stage以调度运行失败的任务,其他类型的Task失败会在TaskScheduler的调度过程中重试。

TaskScheduler:TaskScheduler将接收的TaskSet封装为TaskSetManager(一对一)加入到调度队列中。一个TaskSet含有n多个task信息,这些task都是同一个stage的。TaskScheduler初始化后会启动SchedulerBackend,它负责跟外界打交道,接收Executor的注册信息,并维护Executor的状态。SchedulerBackend监控到有资源后,会询问TaskScheduler有没有任务要运行,TaskScheduler会从调度队列中按照指定的调度策略选择TaskSetManager去调度运行。TaskSetManager按照一定的调度规则一个个取出task给TaskScheduler,TaskScheduler再交给SchedulerBackend去发到Executor上执行。Task被提交到Executor启动执行。Executor进程内部会维护一个线程池,Executor每接收到一个task,都会用TaskRunner封装task,然后从线程池中取出一个线程去执行taskTaskRunner,主要包含两种task:ShuffleMapTask和ResultTask,除了最后一个stage是ResultTask外,其他的stage都是ShuffleMapTask。Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager。这样TaskSetManager就知道Task的运行状态。对于运行失败的Task,TaskSetManager会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的Task池子中等待重新执行,当重试次数过允许的最大次数,整个Application失败。在记录Task失败次数过程中,TaskSetManager还会记录它上一次失败所在的ExecutorId和Host,这样下次再调度这个Task时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊一cherry大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值