Spark入門知識(application, job, stage, task)

http://litaotao.github.io/deep-into-spark-exection-model

1.what這個技術是什麼

官方文檔定義 

spark 裏,job,stage,task 的概念:

  • application(應用):其實就是用spark-submit提交的程序
  • job : A job is triggered by an action, like count() or saveAsTextFile(). Click on a job to see information about the stages of tasks inside it. 理解了嗎,所謂一個 job,就是由一個 rdd 的 action 觸發的動作,可以簡單的理解爲,當你需要執行一個 rdd 的 action 的時候,會生成一個 job。
  • stage : stage 是一個 job 的組成單位,就是說,一個 job 會被切分成 1 個或 1 個以上的 stage,然後各個 stage 會按照執行順序依次執行。至於 job 根據什麼標準來切分 stage,可以回顧第二篇博文:『 Spark 』2. spark 基本概念解析 
  • task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一個任務執行單元,一般來說,一個 rdd 有多少個 partition,就會有多少個 task,因爲每一個 task 只是處理一個 partition 上的數據。從 web ui 截圖上我們可以看到,這個 job 一共有 2 個 stage,66 個 task,平均下來每個 stage 有 33 個 task,相當於每個 stage 的數據都有 33 個 partition [注意:這裏是平均下來的哦,並不都是每個 stage 有 33 個 task,有時候也會有一個 stage 多,另外一個 stage 少的情況,就看你有沒有在不同的 stage 進行 repartition 類似的操作了。]

 

2.why爲什麼有這個技術

此技術解決什麼問題

  1. 提交application,構建Spark Application的運行環境,啓動SparkContext
  2. SparkContext向資源管理器(可以是Standalone,Mesos,Yarn)申請運行Executor資源,並啓動StandaloneExecutorbackend,
  3. Executor向SparkContext申請Task
  4. SparkContext將應用程序分發給Executor
  5. SparkContext構建成DAG圖,將DAG圖分解成Stage、將Taskset發送給Task Scheduler,最後由Task Scheduler將Task發送給Executor運行
  6. Task在Executor上運行,運行完釋放所有資源

 

3.how怎麼學這個技術

運行流程之 : job

根據上面的截圖和再次重溫,我們知道這個 spark 應用裏只有一個 job,那就是因爲我們執行了一個 collect 操作,即把處理後的數據全部返回到我們的 driver 上,進行後續的畫圖,返回的數據如下圖:

baby-name-3.jpg

 

job數不等於stage數例子每個action操作是一個job。而每一個寬依賴將會產生一個stage):http://blog.sina.com.cn/s/blog_6dd718930102xgm3.html

我們這個 spark 應用,生成了一個 job,這個 job 由 2 個 stage 組成,並且每個 stage 都有 33 個task,說明每個 stage 的數據都在 33 個 partition 上,這下我們就來看看,這兩個 stage 的情況。

首先,我們先看看爲什麼這裏會有兩個 stage,根據 『 Spark 』2. spark 基本概念解析  中對 stage 的描述,目前有兩個劃分 stage 的標準:

  • 當觸發 rdd 的 action 時 : 在我們的應用中就是最後的 collect 操作,關於這個操作的說明,可以看官方文檔: rdd.collect
  • 當觸發 rdd 的 shuffle 操作時 (寬依賴往往對應着shuffle操作,需要在運行過程中將同一個父RDD的分區傳入到不同的子RDD分區中): 在我們的應用中就是 reduceByKey 這個操作,官方文檔: rdd.reduceByKey

baby-name-4.jpg

再次回顧上面那張圖:

 

這下應該就明瞭了,關於兩個 stage 的情況:

baby-name-5.jpg

  • 第一個 stage,即截圖中 stage id 爲 0 的 stage,其執行了 sc.wholeTextFiles().map().flatMap().map().reduceByKey() 這幾個步驟,因爲這是一個 Shuffle 操作,所以後面會有 Shuffle Read 和 Shuffle Write。具體來說,就是在 stage 0 這個 stage 中,發生了一個 Shuffle 操作,這個操作讀入 22.5 MB 的數據,生成 41.7 KB 的數據,並把生成的數據寫在了硬盤上。

  • 第二個 stage,即截圖中 stage id 爲 1 到 stage,其執行了 collect() 這個操作,因爲這是一個 action 操作,並且它上一步是一個 Shuffle 操作,且沒有後續操作,所以這裏 collect() 這個操作被獨立成一個 stage 了。這裏它把上一個 Shuffle 寫下的數據讀取進來,然後一起返回到 driver 端,所以這裏可以看到他的 Shuffle Read 這裏剛好讀取了上一個 stage 寫下的數據。

其實到這裏應該都理解得差不多了,至於爲什麼每個 stage 會有 33 個 task [即我們的數據文件存放到 33 個partition 上。

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