理解spark中的job、stage、task
什么是Spark?
Spark是處理大數據常用的計算引擎。Spark是一個用來實現快速而通用的集群計算的平臺。擴展了廣泛使用的MapReduce計算模型,而且高效地支持更多的計算模式,包括交互式查詢和流處理。和MapReduce相比,spark支持內存計算,一般比MapReduce更高效。
一般我們在提交spark任務的時候,都會去其UI界面查看任務運行狀況。其中就有job、stage、task的一些執行進度展示。今天,就詳細說明一下這些名詞術語的含義。
Job
spark中的數據都是抽象為RDD的,它支持兩種類型的算子操作:Transformation和Action。Transformation算子的代碼不會真正被執行。只有當我們的程序里面遇到一個action算子的時候,代碼才會真正的被執行。
Transformation算子主要包括:map、mapPartitions、flatMap、filter、union、groupByKey、repartition、cache等。
Action算子主要包括:reduce、collect、show、count、foreach、saveAsTextFile等。
當在程序中遇到一個action算子的時候,就會提交一個job,執行前面的一系列操作。因此平時要注意,如果聲明了數據需要cache或者persist,但在action操作前釋放掉的話,該數據實際上并沒有被緩存。
通常一個任務會有多個job,job之間是按照串行的方式執行的。一個job執行完成后,才會起下一個job。有一段時間曾想讓job并行執行,但沒有找到解決方法。
Stage
一個job通常包含一個或多個stage。各個stage之間按照順序執行。上面已經說過,一個job會有多個算子操作。這些算子都是將一個父RDD轉換成子RDD。這個過程中,會有兩種情況:父RDD中的數據是否進入不同的子RDD。如果一個父RDD的數據只進入到一個子RDD,比如map、union等操作,稱之為narrow dependency(窄依賴)。否則,就會形成wide dependency( 寬依賴),一般也成為shuffle依賴,比如groupByKey等操作。
job中stage的劃分就是根據shuffle依賴進行的。shuffle依賴是兩個stage的分界點。shuffle操作一般都是任務中最耗時耗資源的部分。因為數據可能存放在HDFS不同的節點上,下一個stage的執行首先要去拉取上一個stage的數據(shuffle read操作),保存在自己的節點上,就會增加網絡通信和IO。Shuffle操作其實是一個比較復雜的過程,這里暫且不表。
Task
一個spark application提交后,陸續被分解為job、stage,到這里其實還是一個比較粗的概念。Stage繼續往下分解,就是Task。Task應該是spark最細的執行單元了。Task的數量其實就是stage的并行度。
RDD在計算的時候,每個分區都會起一個task,所以rdd的分區數目決定了總的的task數目。每個Task執行的結果就是生成了目標RDD的一個partiton。在Map階段partition數目保持不變。在Reduce階段,RDD的聚合會觸發shuffle操作,聚合后的RDD的partition數目跟具體操作有關,例如repartition操作會聚合成指定分區數。coalesce算子同樣可以改變partition的數目,不過只能減少不能增加。repartition和coalesce算子的區別在于前者會引發shuffle,后者則不會。
到這里,基本上介紹完了job、stage、task的一些特性。
總結
以上是生活随笔為你收集整理的理解spark中的job、stage、task的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hbase集群重启后异常删除zookee
- 下一篇: spark RDD的血缘关系