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