Spark入門詳解(二)-Spark運行原理

個人博客原文鏈接

Spark運行過程

Spark應用程序以進程集合爲單位在分佈式集羣上運行,通過driver程序的main方法創建的SparkContext對象與集羣交互。

Spark大致運行流程:
Spark運行原理圖

1、Spark通過SparkContext向Cluster manager(資源管理器)申請所需執行的資源(cpu、內存等)

2、Cluster manager分配應用程序執行需要的資源,在Worker節點上創建Executor

3、SparkContext 將程序代碼(jar包或者python文件)和Task任務發送給Executor執行,並收集結果給Driver。

Spark詳細運行流程:
Spark詳細運行過程
Spark運行流程描述

Spark架構組件

  1. Application
    Spark應用程序:指的是用戶編寫的Spark應用程序,包含了Driver功能代碼和分佈在集羣中多個節點上運行的Executor代碼。Spark應用程序,由一個或多個作業JOB組成,如下圖所示。
    Spark應用程序組成

  2. Driver
    驅動程序:Spark中的Driver即運行上述Application的Main()函數並且創建SparkContext,其中創建SparkContext的目的是爲了準備Spark應用程序的運行環境。在Spark中由SparkContext負責和ClusterManager通信,進行資源的申請、任務的分配和監控等;當Executor部分運行完畢後,Driver負責將SparkContext關閉。通常SparkContext代表Driver,如下圖所示。
    Driver驅動程序組成

  3. Cluster Manager
    資源管理器:指的是在集羣上獲取資源的外部服務,常用的有:Standalone,Spark原生的資源管理器,由Master負責資源的分配;Haddop Yarn,由Yarn中的ResearchManager負責資源的分配;Messos,由Messos中的Messos Master負責資源管理。

  4. Executor
    執行器: Application運行在Worker節點上的一個進程,該進程負責運行Task,並且負責將數據存在內存或者磁盤上,每個Application都有各自獨立的一批Executor,如下圖所示。
    Executor運行原理

  5. Worker
    計算節點:集羣中任何可以運行Application代碼的節點,類似於Yarn中的NodeManager節點。在Standalone模式中指的就是通過Slave文件配置的Worker節點,在Spark on Yarn模式中指的就是NodeManager節點,在Spark on Messos模式中指的就是Messos Slave節點,如下圖所示。
    Worker運行原理

  6. DAGScheduler
    有向無環圖調度器:基於DAG劃分Stage並以TaskSet的形勢提交Stage給TaskScheduler;負責將作業拆分成不同階段的具有依賴關係的多批任務;最重要的任務之一就是:計算作業和任務的依賴關係,制定調度邏輯。在SparkContext初始化的過程中被實例化,一個SparkContext對應創建一個DAGScheduler。
    DAGScheduler圖解

  7. TaskScheduler
    任務調度器:將Taskset提交給worker(集羣)運行並回報結果;負責每個具體任務的實際物理調度。如圖所示。
    TaskScheduler圖解

  8. Job
    作業:由一個或多個調度階段所組成的一次計算作業;包含多個Task組成的並行計算,往往由Spark Action催生,一個JOB包含多個RDD及作用於相應RDD上的各種Operation。如圖所示。
    Job圖解

  9. Stage
    調度階段:一個任務集對應的調度階段;每個Job會被拆分很多組Task,每組任務被稱爲Stage,也可稱TaskSet,一個作業分爲多個階段;Stage分成兩種類型ShuffleMapStage、ResultStage。如圖所示。
    Stage圖解

Application多個job多個Stage:Spark Application中可以因爲不同的Action觸發衆多的job,一個Application中可以有很多的job,每個job是由一個或者多個Stage構成的,後面的Stage依賴於前面的Stage,也就是說只有前面依賴的Stage計算完畢後,後面的Stage纔會運行。

劃分依據:Stage劃分的依據就是寬依賴,何時產生寬依賴,reduceByKey, groupByKey等算子,會導致寬依賴的產生。

核心算法:從後往前回溯,遇到窄依賴加入本stage,遇見寬依賴進行Stage切分。Spark內核會從觸發Action操作的那個RDD開始從後往前推,首先會爲最後一個RDD創建一個stage,然後繼續倒推,如果發現對某個RDD是寬依賴,那麼就會將寬依賴的那個RDD創建一個新的stage,那個RDD就是新的stage的最後一個RDD。然後依次類推,繼續繼續倒推,根據窄依賴或者寬依賴進行stage的劃分,直到所有的RDD全部遍歷完成爲止。

將DAG劃分爲Stage剖析:如上圖,從HDFS中讀入數據生成3個不同的RDD,通過一系列transformation操作後再將計算結果保存回HDFS。可以看到這個DAG中只有join操作是一個寬依賴,Spark內核會以此爲邊界將其前後劃分成不同的Stage. 同時我們可以注意到,在圖中Stage2中,從map到union都是窄依賴,這兩步操作可以形成一個流水線操作,通過map操作生成的partition可以不用等待整個RDD計算結束,而是繼續進行union操作,這樣大大提高了計算的效率。

  1. TaskSet
    任務集:由一組關聯的,但相互之間沒有Shuffle依賴關係的任務所組成的任務集。如圖所示。
    Stage圖解

提示:

1)一個Stage創建一個TaskSet;

2)爲Stage的每個Rdd分區創建一個Task,多個Task封裝成TaskSet

  1. Task
    任務:被送到某個Executor上的工作任務;單個分區數據集上的最小處理流程單元(單個stage內部根據操作數據的分區數劃分成多個task)。如圖所示。
    Task圖解

總覽:
彙總圖解

轉載自:Spark運行原理【史上最詳細】

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