在前面的章節(jié)Client的加載中,Spark的DriverRunner已開始執(zhí)行用戶任務類(比如:org.apache.spark.examples.SparkPi),下面我們開始針對于用戶任務類(或者任務代碼)進行分析

 

一、整體預覽

          基于上篇圖做了擴展,增加任務執(zhí)行的相關交互

     iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓
iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓

  • Code:指的用戶編寫的代碼

  • RDD:彈性分布式數據集,用戶編碼根據SparkContext與RDD的api能夠很好的將Code轉化為RDD數據結構(下文將做轉化細節(jié)介紹)

  • DAGScheduler:有向無環(huán)圖調度器,將RDD封裝為JobSubmitted對象存入EventLoop(實現類DAGSchedulerEventProcessLoop)隊列中

  • EventLoop: 定時掃描未處理JobSubmitted對象,將JobSubmitted對象提交給DAGScheduler

  • DAGScheduler:針對于JobSubmitted進行處理,最終將RDD轉化為執(zhí)行TaskSet,并將TaskSet提交至TaskScheduler

  • TaskScheduler: 根據TaskSet創(chuàng)建TaskSetManager對象存入SchedulableBuilder的數據池(Pool)中,并調用DriverEndpoint喚起消費(ReviveOffers)操作

  • DriverEndpoint:接受ReviveOffers指令后將TaskSet中的Tasks根據相關規(guī)則均勻分配給Executor

  • Executor:啟動一個TaskRunner執(zhí)行一個Task

 

二、Code轉化為初始RDDs

          我們的用戶代碼通過調用Spark的Api(比如:SparkSession.builder.appName("Spark Pi").getOrCreate()),該Api會創(chuàng)建Spark的上下文(SparkContext),當我們調用transform類方法 (如:parallelize(),map())都會創(chuàng)建(或者裝飾已有的) Spark數據結構(RDD), 如果是action類操作(如:reduce()),那么將最后封裝的RDD作為一次Job提交,存入待調度隊列中(DAGSchedulerEventProcessLoop )待后續(xù)異步處理。

          如果多次調用action類操作,那么封裝的多個RDD作為多個Job提交。

     流程如下:

     iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓iOS培訓,Swift培訓,蘋果開發(fā)培訓,移動開發(fā)培訓