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