下面我们一起来看一下Spark的任务调度
Spark任务调度.png
首先最左边的叫做RDD Object就是一个一个的RDD对象 一个一个的RDD对象,可以组成一个有向无环图 一个有向无环图,我们也可以把他叫做一个Application应用程序 有向无环图用代码来表示,他就是一个应用程序
image.png
然后他把DAG传给了一个叫做DAGScheduler的一个东西 DAGScheduler是一个对象,他是任务调度的一个高层调度器
DAGScheduler这个对象他有什么作用? 我们看下边
image.png
DAGScheduler干的第一件事就是把DAG给切割了, 那他把DAG切割成什么了?切割成一个个Stage了 他那切割Stage依据的是什么?依据RDD之间的宽窄依赖
然后他又以StaskSet的形式提交给TaskScheduler
image.png
TaskScheduler我们叫做是——Spark任务调度的底层调度器
TaskSet和Stage有什么区别呢? 没有区别, Stage我们说他是有一组可以并行计算的task TaskSet看他的名字就知道他是一些Task的集合, 只不过封装的对象不一样而已。
刚刚我们都说的是提交,但实际上,是调用了TaskScheduler的一个方法,把TaskSet当做参数传递进来了。
然后TaskScheduler会遍历TaskSet这个集合 拿到每一个Task之后,他会把这些Task发送到每一个计算节点当中去。 计算节点我们叫什么?叫做Executor TaskScheduler会遍历TaskSet里面的每一个Task,然后把Task提交到Executor中的线程池中去。 Executor中执行的Task的执行状态,会向TaskScheduler来反馈 Task是有可能会失败的,在线程池中执行,是有可能会失败的对吧?
如果Task运行失败,TaskScheduler是负责失败重试,TaskScheduler会把失败的任务,重新发送给Executor默认重试发送3次, 如果3次依然失败,那么这个Task所在的Stage就失败了 如果Stage失败了怎么办? 由DAGScheduler负责重新发送Stage,重试次数是4次,如果重试提交Stage4次依然还是失败的话 整个Job就失败了,如果job失败了,他整个Application就失败了。
TaskScheduler除了能重新发送失败的task 还能处理落后的task,如果TaskScheduler发现落后的Task
我们总结一下TaskScheduler