以下是我對spark任務提交的理解
1、將我們編寫的程式打成jar包
2、呼叫spark-submit指令碼提交任務到集群上執行
3、執行sparksubmit的main方法,在這個方法中通過反射的方式建立我們編寫的主類的例項物件,然後呼叫main方法,開始執行我們的**(注意,我們的spark程式中的driver就執行在sparksubmit程序中)
4、當**執行到建立sparkcontext物件時,那就開始初始化sparkcontext物件了
5、在初始化sparkcontext物件的時候,會建立兩個特別重要的物件,分別是:dagscheduler和taskscheduler
【dagscheduler的作用】將rdd的依賴切分成乙個乙個的stage,然後將stage作為taskset提交給driveractor
6、在構建taskscheduler的同時,會建立兩個非常重要的物件,分別是driveractor和clientactor
【clientactor的作用】向master註冊使用者提交的任務
【driveractor的作用】接受executor的反向註冊,將任務提交給executor
9、當輪到我們提交的任務執行時,就開始呼叫schedule(),進行任務資源的排程
10、master將排程好的資源封裝到launchexecutor中傳送給指定的worker
11、worker接受到maseter傳送來的launchexecutor時,會將其解壓並封裝到executorrunner中,然後呼叫這個物件的start(), 啟動executor
12、executor啟動後會向driveractor進行反向註冊
13、driveractor會傳送註冊成功的訊息給executor
14、executor接受到driveractor註冊成功的訊息後會建立乙個執行緒池,用於執行driveractor傳送過來的task任務
15、當屬於這個任務的所有的executor啟動並反向註冊成功後,就意味著執行這個任務的環境已經準備好了,driver會結束sparkcontext物件的初始化,也就意味著new sparkcontext這句**執行完成
16、當初始化sc成功後,driver端就會繼續執行我們編寫的**,然後開始建立初始的rdd,然後進行一系列轉換操作,當遇到乙個action運算元時,也就意味著觸發了乙個job
17、driver會將這個job提交給dagscheduler
18、dagscheduler將接受到的job,從最後乙個運算元向前推導,將dag依據寬依賴劃分成乙個乙個的stage,然後將stage封裝成taskset,並將taskset中的task提交給driveractor
19、driveractor接受到dagscheduler傳送過來的task,會拿到乙個序列化器,對task進行序列化,然後將序列化好的task封裝到launchtask中,然後將launchtask傳送給指定的executor
20、executor接受到了driveractor傳送過來的launchtask時,會拿到乙個反序列化器,對launchtask進行反序列化,封裝到taskrunner中,然後從executor這個執行緒池中獲取乙個執行緒,將反序列化好的任務中的運算元作用在rdd對應的分割槽上
spark 任務劃分
窄依賴指的是每乙個父rdd的partition最多被子rdd的乙個partition使用,窄依賴我們形象的比喻為獨生子女 寬依賴指的是多個子rdd的partition會依賴同乙個父rdd的partition,會引起shuffle,總結 寬依賴我們形象的比喻為超生 dag 叫做有向無環圖,原始的 rd...
Spark任務提交執行全流程詳解
spark任務的本質是對我們編寫的rdd的依賴關係切分成乙個個stage,將stage按照分區分批次的生成taskset傳送到executor進行任務的執行 spark任務分兩種 1 shufflemaptask shuffle之後的task 2 resulttask shuffle之前的task ...
Spark任務執行原理
首先,先看一幅圖 以上圖中有四個機器節點,driver 和 worker 是啟動在伺服器節點上的程序,這些程序都執行在 jvm 中。上述圖的執行步驟 driver 與集群節點之間有頻繁的通訊。driver 負責任務 tasks 的分發和結果的 任務的排程。如果 task的計算結果非常大就不要 了,會...