亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

『 Spark 』6. 深入研究 spark 運(yùn)行原理之 job, stage, task

Me_Kun / 3427人閱讀

摘要:原文地址深入研究運(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)簽中打開圖片,查看原圖哦。

1. spark 運(yùn)行原理

這一節(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 ReadShuffle 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ù)回到這里,解答這里的問題。






2. Next

既然我們都慢慢開始深入理解 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

相關(guān)文章

  • Spark 』2. spark 基本概念解析

    摘要:原文基本概念解析寫在前面本系列是綜合了自己在學(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í)...

    Luosunce 評(píng)論0 收藏0
  • Spark 』1. spark 簡(jiǎn)介

    摘要:原文鏈接簡(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)。寫...

    G9YH 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<