轉載請註明出處:http://www.cnblogs.com/BYRans/
spa
本文主要介紹在單個任務內Spark的調度管理,Spark調度相關概念以下:3d
各概念間的邏輯關係以下圖所示:對象
Spark的調度管理模塊中,最重要的類是DAGScheduler和TaskScheduler,TaskScheduler負責每一個具體任務的實際物理調度,DAGScheduler負責將做業拆分紅不一樣階段的具備依賴關係的多批任務,能夠理解爲DAGScheduler負責任務的邏輯調度。Spark調度管理示意圖以下:
blog
一個Spark任務提交後,DAGScheduler從RDD依賴鏈末端的RDD出發,遍歷整個RDD依賴鏈,將Job分解成具備先後依賴關係的多個stage。DAGScheduler是根據ShuffleDependency劃分stage的,也就是說當某個RDD的運算須要將數據進行shuffle操做時,這個包含了shuffle依賴關係的RDD將被用來做爲輸入信息,構建一個新的調度階段。以此爲依據劃分調度階段,能夠確保有依賴關係的數據可以按照正確的順序獲得處理和運算。隊列
在劃分Stage的步驟中會獲得一個或多個有依賴關係的Stage,其中直接觸發做業的RDD關聯的調度階段被稱爲FinalStage,DAGScheduler從FinalStage開始生成一個Job。Job和Stage的關係存儲在一個映射表中,用於在該調度階段所有完成時作一些後續處理,如報告狀態、清理做業相關數據等。get
具體提交一個Stage時,首先判斷其依賴的全部父Stage的結果是否可用。若是全部父Stage的結果均可用,則提交該Stage。若是有任何一個父Stage的結果不可用,則嘗試迭代提交當前不可用的父Stage。在迭代過程當中,父Stage還未運行的Stage都被放到等待隊列中,等待未來被提交。it
下圖是一個具備四個調度階段的Job的Stage提交順序:spark
當一個屬於中間過程調度階段的任務(這種類型的任務所對應的類爲ShuffleMapTask)完成後,DAGScheduler會檢查對應調度階段的全部任務是否都完成了。若是完成了,則DAGScheduler將從新掃描一次等待列表中全部的Stage,檢查它們是否還有依賴的Stage沒有完成。若是全部依賴的Stage都已執行完畢,則提交該Stage。io
在這裏,博主有一個疑問:可否按照DAG劃分的Stage的拓撲順序提交執行Stage?求你們指點迷津。class
根據任務結果的大小不一樣,ResultTask返回的結果分爲兩中形式: