SparkConf加載與SparkContext建立(源碼閱讀四)

  sparkContext建立還沒完呢,緊接着前兩天,咱們繼續探索。。做死。。。緩存

  緊接着前幾天咱們繼續SparkContext的建立:app

 

  接下來從這裏咱們能夠看到,spark開始加載hadoop的配置信息,第二張圖中 new出來的Configuration正是hadoop的Configuration。同時,將全部sparkConf中全部以spark.hadoop.開頭的屬性都複製到了Hadoop的Configuration.同時又將spark.buffer.size複製爲Hadoop的Configuration的配置的Io.file.buffer.size.隨之加載相關jar包。再下來,咱們能夠看到:oop

  咱們能夠看到,將全部的executor的環境變量加載於_executorMemory以及executorEnvs,後續應該在註冊executor時進行調用。隨之建立_taskScheduler:spa

  

  那麼咱們深刻看下createTaskScheduler的過程:3d

  

  這裏能夠看到,它幹了不少變態的事情,那麼先說下,什麼是TaskScheduler呢?TaskScheduler負責任務的提交,而且請求集羣管理器對任務調度。TaskScheduler也能夠看作任務調度的客戶端。那麼createTaskScheduler會根據master的配置(master match),匹配部署模式,利用反射建立yarn-cluster(本例圖中爲local及yarn-cluster),隨之initializeCoarseGrainedSchedulerBackend。(之後再深刻了解CoarseGrainedSchedulerBackend)blog

  代碼中能夠看到,建立了TaskSchedulerImpl,它是什麼呢?事件

  它從SparkConf中讀取配置信息,包括每一個任務分配的CPU數,失敗task重試次數(可經過spark.task.maxFailures來配置),多久推測執行一次spark.speculation.interval(固然是在spark.speculation爲true的狀況下生效)等等。這裏還有個調度模式,調度模式分爲FIFO和FAIR兩種,經過修改參數spark.scheduler.mode來改變。 最終建立TaskResultGetter,它的做用是對executor中的task的執行結果進行處理。hadoop

  隨之,開始建立DAG。DAGScheduler主要用於在任務正式交給TaskSchedulerImpl提交以前作一些準備工做。建立job,將DAG中的RDD劃分到不一樣的Stage,提交Stage,等等。部署

  

  咱們繼續深刻看下它的建立過程。get

  

  從這些變量中,咱們能夠看到,DAG是將全部jobId,stageId等信息之間的關係,以及緩存的RDD的partition位置等。好比getCacheLocs、getShuffleMapStage、getParentStagesAndId、newOrUsedShuffleStage。下來,經過applicationId註冊並建立executor.

  

  

  中間省略一萬字(實際上是沒看懂),下來建立並啓動ExecutorAllocationManager,它是幹嗎的呢?

  

  ExecutorAllocationManager是對全部的已分配的Executor進行管理。默認狀況下不會建立ExecutorAllocationManager,能夠修改屬性spark.dynamicAllocation.enabled爲true來建立。ExecutorAllocationManager能夠設置動態分配最小Executor數量、動態分配最大Executor數量,每一個Executor能夠運行的Task數量等配置信息。(這個還真要試一下,沒有配置過)ExecutorAllocationListener經過監聽listenerBus裏的事件、動態添加、刪除exeuctor,經過Thread不斷添加Executor,遍歷Executor,將超時的Executor殺掉並移除。

參考文獻:《深刻理解Spark核心思想與源碼解析》

相關文章
相關標籤/搜索