spark調度的幾個概念
集羣
一個spark集羣可以同時運行多個spark應用
應用
1、main方法、spark-shell、spark-submit能夠運行的spark程序
2、可以理解爲創建SparkContext的driver運行的程序
3、一個spark應用可以運行多個job
job
job對應應用中的行動算子,每執行一個行動算子都會提交一個job
一個job由多個stage(階段)組成
stage階段
一個寬依賴做一次階段的劃分
寬依賴就是shuffle依賴,發生了shuffle的操作都是寬依賴
以下算子都會引發shuffle
**Bykey、repartition、groupBy、SortBy、join
階段的個數 = 寬依賴的個數 + 1
一個stage由多個task組成
task任務
task是每個並行的計算過程,並運行於executor(這裏需要注意和executor的關係)
task是真正處理數據的動作
spark調度流程示意圖
如上圖所示:
1、階段1中,雖然有一次map算子的調用,並生成了新的RDD,但是並沒有產生shuffle,所以在同一階段
2、階段1中有兩個分區,所以會有兩個task並行運行於executor
注意:task對應着線程,executor對應在集羣實例節點上的進程,對比與hadoop中mapReduce中的maptask或reducetask(進程),task線程會輕很多,而executor是啓動集羣就創建好的,task運行在哪個executor中需要driver進行調度
每個task處理一個partition分區
3、階段1沒運行完,階段2不可以開始
4、上圖對應着一個DAG有向無環圖,對應着一次行動算子的調用,一個job
5、當task被提交到executor之後,會根據executor可用的cpu核數,決定一個executor中最多同時運行多少個task
分佈式計算的精髓
分佈式計算的精髓在於,如何把抽象的計算流圖,轉化爲實實在在的分佈式計算任務,然後以並行計算的方式交付執行。
這也是spark最牛的地方:操作分佈式的數據儘量感知不到是分佈式的