概念
RDD: 彈性分佈式數據集(由分區組成),每個分區在不同節點上
job:在裏面可以看到當前應用分析出來的所有任務,以及所有的excutors中action的執行時間。
stage:在裏面可以看到應用的所有stage,stage是按照寬依賴來區分的,因此粒度上要比job更細一些。從作業調度角度展示調度的階段和任務的完成裝填
storage:我們所做的cache persist等操作,都會在這裏看到,可以看出來應用目前使用了多少緩存。從存儲角度展示RDD的存儲狀態
environment:裏面展示了當前spark所依賴的環境,比如jdk,lib等等。spark以及系統參數
executors:這裏可以看到執行者申請使用的內存以及shuffle中input和output等數據。從執行角度展示每個executor運行任務的狀況
https://blog.csdn.net/hjw199089/article/details/77938688 Spark中job、stage、task的劃分+源碼執行過程分析
https://www.jianshu.com/p/3aa52ee3a802 理解Spark中Job-Stage-Task之間的關係
Job-Stage-Task之間的關係
如下圖所示,一個Spark程序可以被劃分爲一個或多個Job,劃分的依據是RDD的Action算子,每遇到一個RDD的Action操作就生成一個新的Job。
每個spark Job在具體執行過程中因爲shuffle的存在,需要將其劃分爲一個或多個可以並行計算的stage,劃分的依據是RDD間的Dependency關係,當遇到Wide Dependency時因需要進行shuffle操作,這涉及到了不同Partition之間進行數據合併,故以此爲界劃分不同的Stage。
Stage是由Task組組成的並行計算,因此每個stage中可能存在多個Task,這些Task執行相同的程序邏輯,只是它們操作的數據不同。一般RDD的一個Partition對應一個Task,Task可以分爲ResultTask和ShuffleMapTask。
https://blog.csdn.net/chengyuqiang/article/details/78170224 RDD依賴關係與stage劃分
stage劃分
由於shuffle依賴必須等RDD的父RDD分區數據全部可讀之後才能開始計算,因此spark的設計是讓父 RDD將結果寫在本地,完全寫完之後,通知後面的RDD。後面的RDD則首先去讀之前RDD的本地數據作爲輸入,然後進行運算。
由於上述特性,將shuffle依賴就必須分爲兩個階段(stage)去做:
(1)第1個階段(stage)需要把結果shuffle到本地,例如reduceByKey,首先要聚合某個key的所有記錄,才能進行下一步的reduce計算,這個匯聚的過程就是shuffle。
(2)第2個階段(stage)則讀入數據進行處理。
爲什麼要寫在本地?
後面的RDD多個分區都要去讀這個信息,如果放到內存,如果出現數據丟失,後面的所有步驟全部不能進行,違背了之前所說的需要父RDD分區數據全部ready的原則。
同一個stage裏面的task是可以併發執行的,下一個stage要等前一個stage ready(和mapreduce的reduce需要等map過程ready 一脈相承)。
Spark 將任務以 shuffle 依賴(寬依賴)爲邊界打散,劃分多個 Stage. 最後的結果階段叫做 ResultStage, 其它階段叫 ShuffleMapStage, 從後往前推導,依將計算。
1.從後往前推理,遇到寬依賴就斷開,遇到窄依賴就把當前RDD加入到該Stage
2.每個Stage裏面Task的數量是由該Stage中最後一個RDD的Partition的數量所決定的。
3.最後一個Stage裏面的任務類型是ResultTask,前面其他所有的Stage的任務類型是ShuffleMapTask。
4.代表當前Stage的算子一定是該Stage的最後一個計算步驟
表面上看是數據在流動,實質上是算子在流動。
(1)數據不動代碼動
(2)在一個Stage內部算子爲何會流動(Pipeline)?首先是算子合併,也就是所謂的函數式編程的執行的時候最終進行函數的展開從而把一個Stage內部的多個算子合併成爲一個大算子(其內部包含了當前Stage中所有算子對數據的計算邏輯);其次,是由於Transformation操作的Lazy特性!在具體算子交給集羣的Executor計算之前首先會通過Spark Framework(DAGScheduler)進行算子的優化(基於數據本地性的Pipeline)。
Spark SQL job stage 切分規則
讀一張表會切分一個job
sort merge join 會切分一個job
job中 遇到 shuffle(group by,distinct,distribute by,join) 會切分 stage,這個和rdd的切分一樣
stage 中 連着的 filter,project 操作可以形成一個 whole stage codegen
Spark SQL特點
1.容易集成:已經集成到 Spark 中
2.提供統一的數據訪問方式:訪問接口 DataFrame(DataSet)
Spark SQL數據源:Oracle中的數據、文本(csv、json)、Hive 的表
3.兼容 Hive
4.提供標準的數據連接方式:JDBC 和 ODBC
Spark SQL 的數據模型:DataFrame(表)
1.表=表結構 + 數據
2.DataFrame = Schema(表結構) + RDD(數據)
https://snaildove.github.io/2020/02/10/summary_of_Translation(SparkTheDefinitiveGuide)_online/ 《Spark權威指南》的翻譯綜述
Transformations:
一個RDD上指定轉換以創建另一個
distinct、filter、map、flatMap、sort
Actions:
action(動作/算子)要麼將數據收集到驅動程序,要麼寫入外部數據源。
reduce、count、first、max、take、saveAsTextFile
共享變量:
1.廣播變量是共享的,不可變的變量,它們緩存在集羣中的每臺計算機上,而不是與每個任務序列化。
2.累加器是Spark的第二種共享變量,是一種在各種轉換中更新值並將該值以有效且容錯的方式傳播到驅動程序節點的方法。