下面我们一起来看一下Spark的任务调度
首先最左边的叫做RDD Object就是一个一个的RDD对象
一个一个的RDD对象,可以组成一个有向无环图
一个有向无环图,我们也可以把他叫做一个Application应用程序
有向无环图用代码来表示,他就是一个应用程序
疑问,生成有向无环图的这个东西叫什么名字?
然后他把DAG传给了一个叫做DAGScheduler的一个东西
DAGScheduler是一个对象,他是任务调度的一个高层调度器
DAGScheduler这个对象他有什么作用?
我们看下边
DAGScheduler干的第一件事就是把DAG给切割了,
那他把DAG切割成什么了?切割成一个个Stage了
他那切割Stage依据的是什么?依据RDD之间的宽窄依赖
然后他又以StaskSet的形式提交给TaskScheduler
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
- launch Task
- retry failed
3.Straggling Task