Spark DAG概述

概要

DAG,有向無環圖,Directed Acyclic Graph的縮寫,常用於建模。Spark中使用DAG對RDD的關係進行建模,描述了RDD的依賴關係,這種關係也被稱之爲lineage,RDD的依賴關係使用Dependency維護,參考Spark RDD之Dependency,DAG在Spark中的對應的實現爲DAGScheduler

基礎概念

介紹DAGScheduler中的一些概念,有助於理解後續流程。

名詞 解釋
Job 調用RDD的一個action,如count,即觸發一個Job,spark中對應實現爲ActiveJob,DAGScheduler中使用集合activeJobs和jobIdToActiveJob維護Job
Stage 代表一個Job的DAG,會在發生shuffle處被切分,切分後每一個部分即爲一個Stage,Stage實現分爲ShuffleMapStage和ResultStage,一個Job切分的結果是0個或多個ShuffleMapStage加一個ResultStage
Task 最終被髮送到Executor執行的任務,和stage的ShuffleMapStage和ResultStage對應,其實現分爲ShuffleMapTask和ResultTask

DAGScheduler作用


如上圖,DAGScheduler的作用主要有

  1. compute DAG,執行DAG,得到stage和對應的task,通過TaskScheduler提交到集羣,流程大致如下

    Spark DAG之SubmitJob
    Spark DAG之劃分Stage
    Spark DAG之SubmitStage
    Spark DAG之SubmitTask
  2. preferred locations,就近執行。
    根據cache信息和RDD的preferredLocations獲取preferred location。
  3. fault-tolerant,stage級別的容錯。
    shuffle結束後,reducer讀取map的輸出,如果讀取失敗,會觸發DAGScheduler重新提交對應的Stage。

示例

以一段代碼爲例,大致介紹DAGScheduler的作用。

    val sc = new SparkContext("local","wordcount")
    val data = sc.parallelize(List("a c", "a b", "b c", "b d", "c d"), 2)
    val wordcount = data.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
    wordcount.join(wordcount).collect()

上面代碼的邏輯是,先求Wordcount,再做一個join,打印其RDD的依賴關係,如下

如上圖,代碼中reduceByKey處發生shuffle,共有兩處,所以對應的DAG圖如下

上圖中stage的具體類型以及對應的task類型如下

stage 0 stage 1 stage 2
ShuffleMapStage ShuffleMapStage ResultStage
ShuffleMapTask ShuffleMapTask ResultTask

最後,DAGScheduler通過TaskScheduler提交ShuffleMapTask和ResultTask到Executor,完成計算。

總結

簡單介紹DAGScheduler的作用,以及Stage、Task等概念,並舉了一個具體例子,後續結合代碼,詳細介紹整個流程。

參考:
DAGScheduler
DAGScheduler — Stage-Oriented Scheduler
Spark job submission breakdown
MEMTUNE: Dynamic Memory Management for
In-memory Data Analytic Platforms

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章