0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

spark運(yùn)行的基本流程

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-07-02 10:31 ? 次閱讀

前言:

由于最近對(duì)spark的運(yùn)行流程非常感興趣,所以閱讀了《Spark大數(shù)據(jù)處理:技術(shù)、應(yīng)用與性能優(yōu)化》一書。通過這本書的學(xué)習(xí),了解了spark的核心技術(shù)、實(shí)際應(yīng)用場(chǎng)景以及性能優(yōu)化的方法。本文旨在記錄和分享下spark運(yùn)行的基本流程。

一、spark的基礎(chǔ)組件及其概念

1. ClusterManager

在Standalone模式中即為Master,控制整個(gè)集群,監(jiān)控Worker。在YARN模式中為資源管理器。

2. Application

用戶自定義的spark程序, 用戶提交后, Spark為App分配資源, 將程序轉(zhuǎn)換并執(zhí)行。

3. Driver

在Spark中,driver是一個(gè)核心概念,指的是Spark應(yīng)用程序的主進(jìn)程,也稱為主節(jié)點(diǎn)。負(fù)責(zé)運(yùn)行Application的main( ) 函數(shù)并創(chuàng)建SparkContext。

4. Worker

從節(jié)點(diǎn),負(fù)責(zé)控制計(jì)算節(jié)點(diǎn),啟動(dòng)Executor或Driver。在YARN模式中為NodeManager,負(fù)責(zé)計(jì)算節(jié)點(diǎn)的控制。

5. Executor

執(zhí)行器,在Worker節(jié)點(diǎn)上執(zhí)行任務(wù)的組件、用于啟動(dòng)線程池運(yùn)行任務(wù)。每個(gè)Application擁有獨(dú)立的一組Executors。

6. RDD Graph

RDD是spark的核心結(jié)構(gòu), 可以通過一系列算子進(jìn)行操作( 主要有Transformation和Action操作) 。 當(dāng)RDD遇到Action算子時(shí), 將之前的所有算子形成一個(gè)有向無(wú)環(huán)圖( DAG) , 也就是RDD Graph。 再在Spark中轉(zhuǎn)化為Job, 提交到集群執(zhí)行。一個(gè)App中可以包含多個(gè)Job。

7. Job

一個(gè)RDD Graph觸發(fā)的作業(yè), 往往由Spark Action算子觸發(fā), 在SparkContext中通過runJob方法向Spark提交Job。

8. Stage

每個(gè)Job會(huì)根據(jù)RDD的寬依賴關(guān)系被切分很多Stage, 每個(gè)Stage中包含一組相同的Task, 這一組Task也叫TaskSet。

9. Task

一個(gè)分區(qū)對(duì)應(yīng)一個(gè)Task, Task執(zhí)行RDD中對(duì)應(yīng)Stage中包含的算子。 Task被封裝好后放入Executor的線程池中執(zhí)行。

二、spark架構(gòu)

spark架構(gòu)采用了分布式計(jì)算中的Master-Slave模型。Master作為整個(gè)集群的控制器,負(fù)責(zé)整個(gè)集群的正常運(yùn)行;Worker相當(dāng)于是計(jì)算節(jié)點(diǎn),接收主節(jié)點(diǎn)命令與進(jìn)行狀態(tài)匯報(bào);Executor負(fù)責(zé)任務(wù)的執(zhí)行;Client作為用戶的客戶端負(fù)責(zé)提交應(yīng)用,Driver負(fù)責(zé)控制一個(gè)應(yīng)用的執(zhí)行。

?

??

如圖所示,spark集群部署后,需要在主節(jié)點(diǎn)和從節(jié)點(diǎn)分別啟動(dòng)Master進(jìn)程和Worker進(jìn)程,對(duì)整個(gè)集群進(jìn)行控制。在一個(gè)spark應(yīng)用的執(zhí)行過程中,Driver和Worker是兩個(gè)重要角色。Driver程序是應(yīng)用邏輯執(zhí)行的起點(diǎn),負(fù)責(zé)作業(yè)的調(diào)度,即Task任務(wù)的分發(fā),而多個(gè)Worker用來(lái)管理計(jì)算節(jié)點(diǎn)和創(chuàng)建Executor并行處理任務(wù)。在執(zhí)行階段,Driver會(huì)將Task和Task所依賴的file和jar序列化后傳遞給對(duì)應(yīng)的Worker機(jī)器,同時(shí)Executor對(duì)相應(yīng)數(shù)據(jù)分區(qū)的任務(wù)進(jìn)行處理。

三、Spark的工作機(jī)制

1. Spark的整體流程

Client提交應(yīng)用,Master找到一個(gè)Worker啟動(dòng)Driver,Driver向Master或者資源管理器申請(qǐng)資源,之后將應(yīng)用轉(zhuǎn)化為RDD Graph,再由DAG Scheduler將RDD Graph轉(zhuǎn)化為Stage的有向無(wú)環(huán)圖提交給TaskScheduler,由TaskScheduler提交任務(wù)給Executor執(zhí)行。

?

??

如圖所示,在spark應(yīng)用中,整個(gè)執(zhí)行流程在邏輯上會(huì)形成有向無(wú)環(huán)圖。Action算子觸發(fā)之后,將所有累計(jì)的算子形成一個(gè)有向無(wú)環(huán)圖,然后由調(diào)度器調(diào)度該圖上的任務(wù)進(jìn)行運(yùn)算。spark根據(jù)RDD之間不同的依賴關(guān)系切分形成不同的階段(stage),一個(gè)階段包含一系列函數(shù)執(zhí)行流水線。途中A、B、C、D、E、F、分別代表不同的RDD,RDD內(nèi)的方框代表分區(qū)。數(shù)據(jù)從HDFS輸入spark,形成RDD A和RDD C,RDD C上執(zhí)行map操作,轉(zhuǎn)換為RDD D,RDD B和RDD E執(zhí)行Join操作,轉(zhuǎn)換為F。而在B和E連接轉(zhuǎn)化為F的過程中又會(huì)執(zhí)行Shuffle,最后RDD F通過函數(shù)saveAsSequenceFile輸出并保存到HDFS中。

2. Stage的劃分

如上面這個(gè)運(yùn)行流程所示,在 Apache Spark 中,一個(gè)作業(yè)(Job)通常會(huì)被劃分為多個(gè)階段(Stage),每個(gè)階段包含一組并行的任務(wù)(Task)。這種劃分主要是基于數(shù)據(jù)寬窄依賴進(jìn)行的,以便更有效地進(jìn)行任務(wù)調(diào)度和執(zhí)行。以下是關(guān)于 Spark 中 Stage 劃分的一些關(guān)鍵點(diǎn):

?寬窄依賴

窄依賴(Narrow Dependency):父 RDD 的每個(gè)分區(qū)只會(huì)被一個(gè)子 RDD 的分區(qū)使用,或者多個(gè)子 RDD 分區(qū)計(jì)算時(shí)都使用同一個(gè)父 RDD 分區(qū)。窄依賴允許在一個(gè)集群節(jié)點(diǎn)上以流水線的方式(pipeline)計(jì)算所有父分區(qū),不會(huì)造成網(wǎng)絡(luò)之間的數(shù)據(jù)混洗。

寬依賴(Wide Dependency):父 RDD 的每個(gè)分區(qū)都可能被多個(gè)子 RDD 分區(qū)所使用,會(huì)引起 shuffle。

?Stage的劃分

Spark 根據(jù) RDD 之間的寬窄依賴關(guān)系來(lái)劃分 Stage。遇到寬依賴就劃分一個(gè) Stage,每個(gè) Stage 里面包含多個(gè) Task,Task 的數(shù)量由該 Stage 最后一個(gè) RDD 的分區(qū)數(shù)決定。一個(gè) Stage 內(nèi)部的多個(gè) Task 可以并行執(zhí)行,而 Stage 之間是串行執(zhí)行的。只有當(dāng)一個(gè) Stage 中的所有 Task 都計(jì)算完成后,才會(huì)開始下一個(gè) Stage 的計(jì)算。

?Shuffle 與 Stage 邊界

當(dāng) Spark 遇到一個(gè)寬依賴(如 `reduceByKey`、`groupBy` 等操作)時(shí),它需要在該操作之前和之后分別創(chuàng)建一個(gè)新的 Stage。這是因?yàn)閷捯蕾囆枰?shuffle 數(shù)據(jù),而 shuffle 通常涉及磁盤 I/O,因此將寬依賴作為 Stage 之間的邊界可以提高效率。

3. Stage和Task調(diào)度方式

Stage的調(diào)度是由DAGScheduler完成的。 由RDD的有向無(wú)環(huán)圖DAG切分出了Stage的有向無(wú)環(huán)圖DAG。 Stage的DAG通過最后執(zhí)行Stage為根進(jìn)行廣度優(yōu)先遍歷, 遍歷到最開始執(zhí)行的Stage執(zhí)行, 如果提交的Stage仍有未完成的父母Stage, 則Stage需要等待其父Stage執(zhí)行完才能執(zhí)行。 同時(shí)DAGScheduler中還維持了幾個(gè)重要的Key-Value集合構(gòu), 用來(lái)記錄Stage的狀態(tài), 這樣能夠避免過早執(zhí)行和重復(fù)提交Stage。waitingStages中記錄仍有未執(zhí)行的父母Stage, 防止過早執(zhí)行。 runningStages中保存正在執(zhí)行的Stage, 防止重復(fù)執(zhí)行。failedStages中保存執(zhí)行失敗的Stage, 需要重新執(zhí)行。

每個(gè)Stage包含一組并行的Task,這些Task被組織成TaskSet(任務(wù)集合)。DAGScheduler將劃分好的TaskSet提交給TaskScheduler。TaskScheduler是負(fù)責(zé)Task調(diào)度和集群資源管理的組件。TaskScheduler通過TaskSetManager來(lái)管理每個(gè)TaskSet。TaskSetManager會(huì)跟蹤和控制其管轄的Task的執(zhí)行,包括任務(wù)的啟動(dòng)、狀態(tài)監(jiān)控和失敗重試等。當(dāng)TaskSet被提交到TaskScheduler時(shí),TaskScheduler會(huì)決定在哪些Executor上運(yùn)行Task,并通過集群管理器(如YARN、Mesos或Spark Standalone)將Task分發(fā)到相應(yīng)的節(jié)點(diǎn)上執(zhí)行。Executor接收到Task后,會(huì)在其管理的線程池中執(zhí)行任務(wù)。執(zhí)行過程中,Task的狀態(tài)會(huì)不斷更新,并通過狀態(tài)更新機(jī)制通知TaskSetManager。TaskSetManager根據(jù)接收到的狀態(tài)更新來(lái)跟蹤Task的執(zhí)行情況,如遇到任務(wù)失敗,會(huì)觸發(fā)重試機(jī)制直至達(dá)到設(shè)定的重試次數(shù)。

當(dāng)所有Task都執(zhí)行完成后,TaskScheduler會(huì)通知DAGScheduler,并由DAGScheduler負(fù)責(zé)觸發(fā)后續(xù)Stage的執(zhí)行(如果存在)。

4. Shuffle機(jī)制

為什么spark計(jì)算模型需要Shuffle過程? 我們都知道, spark計(jì)算模型是在分布式的環(huán)境下計(jì)算的, 這就不可能在單進(jìn)程空間中容納所有的計(jì)算數(shù)據(jù)來(lái)進(jìn)行計(jì)算, 這樣數(shù)據(jù)就按照Key進(jìn)行分區(qū), 分配成一塊一塊的小分區(qū), 打散分布在集群的各個(gè)進(jìn)程的內(nèi)存空間中, 并不是所有計(jì)算算子都滿足于按照一種方式分區(qū)進(jìn)行計(jì)算。 例如, 當(dāng)需要對(duì)數(shù)據(jù)進(jìn)行排序存儲(chǔ)時(shí), 就有了重新按照一定的規(guī)則對(duì)數(shù)據(jù)重新分區(qū)的必要, Shuffle就是包裹在各種需要重分區(qū)的算子之下的一個(gè)對(duì)數(shù)據(jù)進(jìn)行重新組合的過程。

?

?如圖, 整個(gè)Job分為Stage1~Stage3, 3個(gè)Stage。首先從最上端的Stage2、 Stage3執(zhí)行, 每個(gè)Stage對(duì)每個(gè)分區(qū)執(zhí)行變換( transformation) 的流水線式的函數(shù)操作, 執(zhí)行到每個(gè)Stage最后階段進(jìn)行Shuffle Write,將數(shù)據(jù)重新根據(jù)下一個(gè)Stage分區(qū)數(shù)分成相應(yīng)的Bucket, 并將Bucket最后寫入磁盤。 這個(gè)過程就是Shuffle Write階段。執(zhí)行完Stage2、 Stage3之后, Stage1去存儲(chǔ)有Shuffle數(shù)據(jù)節(jié)點(diǎn)的磁盤Fetch需要的數(shù)據(jù), 將數(shù)據(jù)Fetch到本地后進(jìn)行用戶定義的聚集函數(shù)操作。 這個(gè)階段叫Shuffle Fetch, Shuffle Fetch包含聚集階段。 這樣一輪一輪的Stage之間就完成了Shuffle操作。

四、結(jié)語(yǔ)

在閱讀《Spark大數(shù)據(jù)處理:技術(shù)、應(yīng)用與性能優(yōu)化》一書后,我大概了解了spark的運(yùn)行機(jī)制及原理。上文僅是做了一個(gè)簡(jiǎn)單的總結(jié),而且并沒有對(duì)一些細(xì)節(jié)進(jìn)行深入解讀。在原書中有著十分詳細(xì)的介紹,包含其容錯(cuò)、IO、網(wǎng)絡(luò)等機(jī)制以及從源碼解析spark的運(yùn)行流程,而且書中通過大量實(shí)際案例,展示了如何在具體應(yīng)用中使用Spark進(jìn)行數(shù)據(jù)處理、分析和挖掘,使理論與實(shí)踐相結(jié)合,大家如有興趣可自行閱讀。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 大數(shù)據(jù)
    +關(guān)注

    關(guān)注

    64

    文章

    8889

    瀏覽量

    137444
  • SPARK
    +關(guān)注

    關(guān)注

    1

    文章

    105

    瀏覽量

    19910
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)字設(shè)計(jì)ic芯片流程

    主要介紹芯片的設(shè)計(jì)流程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? &
    發(fā)表于 11-20 15:57 ?0次下載

    spark為什么比mapreduce快?

    spark為什么比mapreduce快? 首先澄清幾個(gè)誤區(qū): 1:兩者都是基于內(nèi)存計(jì)算的,任何計(jì)算框架都肯定是基于內(nèi)存的,所以網(wǎng)上說(shuō)的spark是基于內(nèi)存計(jì)算所以快,顯然是錯(cuò)誤的 2;DAG計(jì)算模型
    的頭像 發(fā)表于 09-06 09:45 ?269次閱讀

    變電所運(yùn)行維護(hù)的流程措施

    為了確保電網(wǎng)的穩(wěn)定運(yùn)行和高效供電,變電所的運(yùn)行與維護(hù)工作至關(guān)重要,這些工作不僅需要專業(yè)的技術(shù)知識(shí),還需要細(xì)致的操作規(guī)程和嚴(yán)格的管理制度。以下詳細(xì)介紹變電所運(yùn)行維護(hù)的幾個(gè)關(guān)鍵環(huán)節(jié)及其執(zhí)行標(biāo)準(zhǔn)和措施
    的頭像 發(fā)表于 08-30 11:05 ?694次閱讀

    如何正確運(yùn)行步進(jìn)電機(jī)官方例程

    英飛凌官網(wǎng)有提供基于XMC1302的步進(jìn)電機(jī)的demo,但是客戶根據(jù)官網(wǎng)提供的文檔介紹,不知道如何來(lái)使得步進(jìn)電機(jī)正常運(yùn)行。所以我們特意整理了該文檔,詳細(xì)介紹下步進(jìn)電機(jī)例程的完整操作流程
    的頭像 發(fā)表于 08-23 15:59 ?1387次閱讀
    如何正確<b class='flag-5'>運(yùn)行</b>步進(jìn)電機(jī)官方例程

    廣汽能源與泰國(guó)Spark EV簽訂合作框架協(xié)議

    近日,廣汽能源科技(泰國(guó))有限公司與Spark EV Co.Ltd.宣布達(dá)成重要合作,雙方共同簽署了一項(xiàng)合作框架協(xié)議,旨在泰國(guó)境內(nèi)全面布局并運(yùn)營(yíng)超級(jí)充電場(chǎng)站,為新能源汽車的普及與發(fā)展注入強(qiáng)勁動(dòng)力。
    的頭像 發(fā)表于 07-19 17:08 ?867次閱讀

    Spark基于DPU的Native引擎算子卸載方案

    1.背景介紹 Apache Spark(以下簡(jiǎn)稱Spark)是一個(gè)開源的分布式計(jì)算框架,由UC Berkeley AMP Lab開發(fā),可用于批處理、交互式查詢(Spark SQL)、實(shí)時(shí)流處理
    的頭像 發(fā)表于 06-28 17:12 ?586次閱讀
    <b class='flag-5'>Spark</b>基于DPU的Native引擎算子卸載方案

    關(guān)于Spark的從0實(shí)現(xiàn)30s內(nèi)實(shí)時(shí)監(jiān)控指標(biāo)計(jì)算

    前言 說(shuō)起Spark,大家就會(huì)自然而然地想到Flink,而且會(huì)不自覺地將這兩種主流的大數(shù)據(jù)實(shí)時(shí)處理技術(shù)進(jìn)行比較。然后最終得出結(jié)論:Flink實(shí)時(shí)性大于Spark。 的確,F(xiàn)link中的數(shù)據(jù)計(jì)算
    的頭像 發(fā)表于 06-14 15:52 ?453次閱讀

    CT分析儀試驗(yàn)運(yùn)行流程——每日了解電力知識(shí)

    今天武漢摩恩智能電氣有限公司帶大家了解一下MEVA-I CT分析儀。 MEVA-I CT分析儀試驗(yàn)運(yùn)行的一般流程: 儀器的軟件運(yùn)行可以分為“等待新建試驗(yàn)”,“等待試驗(yàn)”,“查看結(jié)果”,“運(yùn)行
    的頭像 發(fā)表于 05-22 09:55 ?426次閱讀
    CT分析儀試驗(yàn)<b class='flag-5'>運(yùn)行</b><b class='flag-5'>流程</b>——每日了解電力知識(shí)

    流程工業(yè)和離散工業(yè)是什么?

    流程工業(yè)和離散工業(yè)是兩種不同類型的工業(yè)生產(chǎn)方式。 流程工業(yè)是指以連續(xù)流程為基礎(chǔ)的生產(chǎn)方式,其生產(chǎn)過程是連續(xù)的、穩(wěn)定的。典型的流程工業(yè)包括石化、化工、制藥和食品加工等行業(yè)。在
    的頭像 發(fā)表于 05-09 14:01 ?750次閱讀

    如何利用DPU加速Spark大數(shù)據(jù)處理? | 總結(jié)篇

    SSD速度通過NVMe接口得到了大幅提升,并且網(wǎng)絡(luò)傳輸速率也進(jìn)入了新的高度,但CPU主頻發(fā)展并未保持同等步調(diào),3GHz左右的核心頻率已成為常態(tài)。 在當(dāng)前背景下Apache Spark等大數(shù)據(jù)處理工具中,盡管存儲(chǔ)和網(wǎng)絡(luò)性能的提升極大地減少了數(shù)據(jù)讀取和傳輸?shù)臅r(shí)間消耗,但
    的頭像 發(fā)表于 04-02 13:45 ?1059次閱讀
    如何利用DPU加速<b class='flag-5'>Spark</b>大數(shù)據(jù)處理? | 總結(jié)篇

    Spark基于DPU Snappy壓縮算法的異構(gòu)加速方案

    一、總體介紹 1.1 背景介紹 Apache Spark是專為大規(guī)模數(shù)據(jù)計(jì)算而設(shè)計(jì)的快速通用的計(jì)算引擎,是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些不同之處使
    的頭像 發(fā)表于 03-26 17:06 ?805次閱讀
    <b class='flag-5'>Spark</b>基于DPU Snappy壓縮算法的異構(gòu)加速方案

    RDMA技術(shù)在Apache Spark中的應(yīng)用

    背景介紹 在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,Apache?Spark已經(jīng)成為了處理大規(guī)模數(shù)據(jù)集的首選框架。作為一個(gè)開源的分布式計(jì)算系統(tǒng),Spark因其高效的大數(shù)據(jù)處理能力而在各行各業(yè)中廣受歡迎。無(wú)論是金融服務(wù)
    的頭像 發(fā)表于 03-25 18:13 ?1542次閱讀
    RDMA技術(shù)在Apache <b class='flag-5'>Spark</b>中的應(yīng)用

    基于DPU和HADOS-RACE加速Spark 3.x

    背景簡(jiǎn)介 Apache Spark(下文簡(jiǎn)稱Spark)是一種開源集群計(jì)算引擎,支持批/流計(jì)算、SQL分析、機(jī)器學(xué)習(xí)、圖計(jì)算等計(jì)算范式,以其強(qiáng)大的容錯(cuò)能力、可擴(kuò)展性、函數(shù)式API、多語(yǔ)言支持(SQL
    的頭像 發(fā)表于 03-25 18:12 ?1359次閱讀
    基于DPU和HADOS-RACE加速<b class='flag-5'>Spark</b> 3.x

    米哈游大數(shù)據(jù)云原生實(shí)踐

    近年來(lái),容器、微服務(wù)、Kubernetes 等各項(xiàng)云原生技術(shù)的日漸成熟,越來(lái)越多的公司開始選擇擁抱云原生,并開始將 AI、大數(shù)據(jù)等類型的企業(yè)應(yīng)用部署運(yùn)行在云原生之上。以 Spark 為例,在云上運(yùn)行
    的頭像 發(fā)表于 01-09 10:41 ?586次閱讀
    米哈游大數(shù)據(jù)云原生實(shí)踐

    數(shù)字電路設(shè)計(jì)有哪些仿真驗(yàn)證流程

    數(shù)字電路設(shè)計(jì)的仿真驗(yàn)證流程是確保設(shè)計(jì)能夠正確運(yùn)行的重要步驟之一。在現(xiàn)代電子設(shè)備中,數(shù)字電路被廣泛應(yīng)用于各種應(yīng)用領(lǐng)域,如計(jì)算機(jī)、通信設(shè)備、汽車電子等等。因此,設(shè)計(jì)師必須通過仿真驗(yàn)證來(lái)確保電路能夠按照
    的頭像 發(fā)表于 01-02 17:00 ?1692次閱讀