下面我們一起來看一下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