摘要:原文地址深入研究運行原理之寫在前面本系列是綜合了自己在學(xué)習(xí)過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。值得深究的是,這個由兩個完成,這兩個一共有個。
原文地址:『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task
寫在前面本系列是綜合了自己在學(xué)習(xí)spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學(xué)習(xí)spark的筆記記錄,所以一切以能夠理解為主,沒有必要的細(xì)節(jié)就不會記錄了,而且文中有時候會出現(xiàn)英文原版文檔,只要不影響理解,都不翻譯了。若想深入了解,最好閱讀參考文章和官方文檔。
其次,本系列是基于目前最新的 spark 1.6.0 系列開始的,spark 目前的更新速度很快,記錄一下版本好還是必要的。
最后,如果各位覺得內(nèi)容有誤,歡迎留言備注,所有留言 24 小時內(nèi)必定回復(fù),非常感謝。
Tips: 如果插圖看起來不明顯,可以:1. 放大網(wǎng)頁;2. 新標(biāo)簽中打開圖片,查看原圖哦。
這一節(jié)是本文的核心,我們可以先拋出一個問題,如果看完這一節(jié),或者這一章之后,你能理解你的整個 spark 應(yīng)用的執(zhí)行流程,那就可以關(guān)掉這個網(wǎng)頁了[對了,關(guān)掉網(wǎng)頁之前記得分享一下哦,哈哈]
Problem: How does user program get translated into units of physical execution ?
我們用一個例子來說明,結(jié)合例子和運行截圖來理解。
1.1 例子,美國 1880 - 2014 年新生嬰兒數(shù)據(jù)統(tǒng)計目標(biāo):用美國 1880 - 2014 年新生嬰兒的數(shù)據(jù)來做做簡單的統(tǒng)計
數(shù)據(jù)源: https://catalog.data.gov
數(shù)據(jù)格式:
每年的新生嬰兒數(shù)據(jù)在一個文件里面
每個文件的每一條數(shù)據(jù)格式:姓名,性別,新生人數(shù)
代碼和結(jié)果展示
### packages import pandas as pd ### spark UDF (User Defined Functions) def map_extract(element): file_path, content = element year = file_path[-8:-4] return [(year, i) for i in content.split(" ") if i] ### spark logic res = sc.wholeTextFiles("hdfs://10.21.208.21:8020/user/mercury/names", minPartitions=40) .map(map_extract) .flatMap(lambda x: x) .map(lambda x: (x[0], int(x[1].split(",")[2]))) .reduceByKey(operator.add) .collect() ### result displaying data = pd.DataFrame.from_records(res, columns=["year", "birth"]) .sort(columns=["year"], ascending=True) ax = data.plot(x=["year"], y=["birth"], figsize=(20, 6), title="US Baby Birth Data from 1897 to 2014", linewidth=3) ax.set_axis_bgcolor("white") ax.grid(color="gray", alpha=0.2, axis="y")1.2 運行流程概覽
還記得我們在 『 Spark 』3. spark 編程模式 講到的構(gòu)建一個 spark application 的過程嗎:
加載數(shù)據(jù)集
處理數(shù)據(jù)
結(jié)果展示
上面的 22 行代碼,就已經(jīng)把構(gòu)建一個 spark app 的三大步驟完成了,amazing, right? 今天我們主要講 spark 的運行邏輯,所以我們就以核心的 11 - 16 ,這六行代碼來作為今天的主線,了解了解 spark 的原理。
可以看到,整個邏輯實際上就用了 sparkContext 的一個函數(shù),rdd 的 3 個 transformation 和 1 個 action。
現(xiàn)在讓我們從 WEB UI 上來看看,當(dāng)我們運行這段代碼的時候,后臺都發(fā)生了什么。
可以看到,執(zhí)行這段代碼的時候,spark 通過分析,優(yōu)化代碼,知道這段代碼需要一個 job 來完成,所以 web ui 上只有一個 job。值得深究的是,這個 job 由兩個 stage 完成,這兩個 state 一共有 66 個 task。
所以,這里我們就再次理解下 spark 里,job,stage,task 的概念:
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 觸發(fā)的動作,可以簡單的理解為,當(dāng)你需要執(zhí)行一個 rdd 的 action 的時候,會生成一個 job。
stage : stage 是一個 job 的組成單位,就是說,一個 job 會被切分成 1 個或 1 個以上的 stage,然后各個 stage 會按照執(zhí)行順序依次執(zhí)行。至于 job 根據(jù)什么標(biāo)準(zhǔn)來切分 stage,可以回顧第二篇博文:『 Spark 』2. spark 基本概念解析
task : A unit of work within a stage, corresponding to one RDD partition。即 stage 下的一個任務(wù)執(zhí)行單元,一般來說,一個 rdd 有多少個 partition,就會有多少個 task,因為每一個 task 只是處理一個 partition 上的數(shù)據(jù)。從 web ui 截圖上我們可以看到,這個 job 一共有 2 個 stage,66 個 task,平均下來每個 stage 有 33 個 task,相當(dāng)于每個 stage 的數(shù)據(jù)都有 33 個 partition [注意:這里是平均下來的哦,并不都是每個 stage 有 33 個 task,有時候也會有一個 stage 多,另外一個 stage 少的情況,就看你有沒有在不同的 stage 進(jìn)行 repartition 類似的操作了。]
1.3 運行流程之 : job根據(jù)上面的截圖和再次重溫,我們知道這個 spark 應(yīng)用里只有一個 job,那就是因為我們執(zhí)行了一個 collect 操作,即把處理后的數(shù)據(jù)全部返回到我們的 driver 上,進(jìn)行后續(xù)的畫圖,返回的數(shù)據(jù)如下圖:
1.4 運行流程之 : stage我們這個 spark 應(yīng)用,生成了一個 job,這個 job 由 2 個 stage 組成,并且每個 stage 都有 33 個task,說明每個 stage 的數(shù)據(jù)都在 33 個 partition 上,這下我們就來看看,這兩個 stage 的情況。
首先,我們先看看為什么這里會有兩個 stage,根據(jù) 『 Spark 』2. spark 基本概念解析 中對 stage 的描述,目前有兩個劃分 stage 的標(biāo)準(zhǔn):
當(dāng)觸發(fā) rdd 的 action 時 : 在我們的應(yīng)用中就是最后的 collect 操作,關(guān)于這個操作的說明,可以看官方文檔: rdd.collect
當(dāng)觸發(fā) rdd 的 shuffle 操作時 : 在我們的應(yīng)用中就是 reduceByKey 這個操作,官方文檔: rdd.reduceByKey
再次回顧上面那張圖:
這下應(yīng)該就明了了,關(guān)于兩個 stage 的情況:
第一個 stage,即截圖中 stage id 為 0 的 stage,其執(zhí)行了 sc.wholeTextFiles().map().flatMap().map().reduceByKey() 這幾個步驟,因為這是一個 Shuffle 操作,所以后面會有 Shuffle Read 和 Shuffle Write。具體來說,就是在 stage 0 這個 stage 中,發(fā)生了一個 Shuffle 操作,這個操作讀入 22.5 MB 的數(shù)據(jù),生成 41.7 KB 的數(shù)據(jù),并把生成的數(shù)據(jù)寫在了硬盤上。
第二個 stage,即截圖中 stage id 為 1 到 stage,其執(zhí)行了 collect() 這個操作,因為這是一個 action 操作,并且它上一步是一個 Shuffle 操作,且沒有后續(xù)操作,所以這里 collect() 這個操作被獨立成一個 stage 了。這里它把上一個 Shuffle 寫下的數(shù)據(jù)讀取進(jìn)來,然后一起返回到 driver 端,所以這里可以看到他的 Shuffle Read 這里剛好讀取了上一個 stage 寫下的數(shù)據(jù)。
1.5 運行流程之 : task其實到這里應(yīng)該都理解得差不多了,至于為什么每個 stage 會有 33 個 task [即我們的數(shù)據(jù)文件存放到 33 個partition 上,可是明明 sc.wholeTextFiles("hdfs://10.21.208.21:8020/user/mercury/names", minPartitions=40) 這里指定了最小要 40 個partition 到啊],這個問題我們留到以后說,在后面我們會有一篇講怎么調(diào)試,優(yōu)化 spark app 的博文,到時候我們會繼續(xù)回到這里,解答這里的問題。
既然我們都慢慢開始深入理解 spark 的執(zhí)行原理了,那下次我們就來說說 spark 的一些配置吧,然后再說說 spark 應(yīng)用的優(yōu)化。
參考文章Tuning and Debugging in Apache Spark
learning spark
Spark配置
Spark 配置指南
本系列文章鏈接『 Spark 』1. spark 簡介
『 Spark 』2. spark 基本概念解析
『 Spark 』3. spark 編程模式
『 Spark 』4. spark 之 RDD
『 Spark 』5. 這些年,你不能錯過的 spark 學(xué)習(xí)資源
『 Spark 』6. 深入研究 spark 運行原理之 job, stage, task
『 Spark 』7. 使用 Spark DataFrame 進(jìn)行大數(shù)據(jù)分析
『 Spark 』8. 實戰(zhàn)案例 | Spark 在金融領(lǐng)域的應(yīng)用 | 日內(nèi)走勢預(yù)測
『 Spark 』9. 搭建 IPython + Notebook + Spark 開發(fā)環(huán)境
『 Spark 』10. spark 應(yīng)用程序性能優(yōu)化|12 個優(yōu)化方法
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37955.html
摘要:原文基本概念解析寫在前面本系列是綜合了自己在學(xué)習(xí)過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。是項目組設(shè)計用來表示數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。 原文:『 Spark 』2. spark 基本概念解析 寫在前面 本系列是綜合了自己在學(xué)習(xí)spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫這樣一個系列僅僅是為了梳理個人學(xué)習(xí)...
摘要:原文鏈接簡介寫在前面本系列是綜合了自己在學(xué)習(xí)過程中的理解記錄對參考文章中的一些理解個人實踐過程中的一些心得而來。其次,本系列是基于目前最新的系列開始的,目前的更新速度很快,記錄一下版本好還是必要的。 原文鏈接:『 Spark 』1. spark 簡介 寫在前面 本系列是綜合了自己在學(xué)習(xí)spark過程中的理解記錄 + 對參考文章中的一些理解 + 個人實踐spark過程中的一些心得而來。寫...
閱讀 1346·2021-11-25 09:43
閱讀 1904·2021-11-12 10:36
閱讀 6018·2021-09-22 15:05
閱讀 3488·2019-08-30 15:55
閱讀 2017·2019-08-26 14:06
閱讀 3648·2019-08-26 12:17
閱讀 507·2019-08-23 17:55
閱讀 2459·2019-08-23 16:23