深度預警:Spark運行原理

點擊關注,快速進階高級架構師

本文主要分以下章節:

一、Spark專業術語定義

二、 Spark的任務提交機制

一、Spark專業術語定義

1、Application:Spark應用程序

指的是用戶編寫的Spark應用程序,包含了Driver功能代碼和分佈在集群中多個節點上運行的Executor代碼。

Spark應用程序,由一個或多個作業JOB組成,如下圖所示:

深度預警:Spark運行原理

image

2、Driver:驅動程序

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

深度預警:Spark運行原理

image

3、Cluster Manager:資源管理器

指的是在集群上獲取資源的外部服務,常用的有:Standalone,Spark原生的資源管理器,由Master負責資源的分配;Haddop Yarn,由Yarn中的ResearchManager負責資源的分配;Messos,由Messos中的Messos Master負責資源管理,如下圖所示:

深度預警:Spark運行原理

image

4、Executor:執行器

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

深度預警:Spark運行原理

image

5、Worker:計算節點

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

深度預警:Spark運行原理

image

6、RDD:彈性分佈式數據集

Resillient Distributed Dataset,Spark的基本計算單元,可以通過一系列算子進行操作(主要有Transformation和Action操作),如下圖所示:

深度預警:Spark運行原理

image

7、窄依賴

父RDD每一個分區最多被一個子RDD的分區所用;表現為一個父RDD的分區對應於一個子RDD的分區,或兩個父RDD的分區對應於一個子RDD 的分區。如圖所示:

深度預警:Spark運行原理

image

8、寬依賴

父RDD的每個分區都可能被多個子RDD分區所使用,子RDD分區通常對應所有的父RDD分區。如圖所示:

深度預警:Spark運行原理

image

常見的窄依賴有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被調用的RDD API是寬依賴(存在shuffle), 而且兩個join的RDD的分區數量一致,join結果的rdd分區數量也一樣,這個時候join api是窄依賴)。

常見的寬依賴有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是寬依賴)。

9、DAG:有向無環圖

Directed Acycle graph,反應RDD之間的依賴關係,如圖所示:

深度預警:Spark運行原理

image

10、DAGScheduler:有向無環圖調度器

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

深度預警:Spark運行原理

image

11、TaskScheduler:任務調度器

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

深度預警:Spark運行原理

image

12、Job:作業

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

深度預警:Spark運行原理

image

13、Stage:調度階段

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

深度預警:Spark運行原理

image

14、TaskSet:任務集

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

深度預警:Spark運行原理

image

提示:

1)一個Stage創建一個TaskSet;

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

15、Task:任務

被送到某個Executor上的工作任務;單個分區數據集上的最小處理流程單元。如圖所示:

深度預警:Spark運行原理

image

總體如圖所示:

深度預警:Spark運行原理

image

二 Spark的任務提交機制

深度預警:Spark運行原理

image

作業執行流程描述:

1、客戶端啟動後直接運行用戶程序,啟動Driver相關的工作:DAGScheduler和BlockManagerMaster等。

2、客戶端的Driver向Master註冊。

3、Master還會讓Worker啟動Exeuctor。Worker創建一個ExecutorRunner線程,ExecutorRunner會啟動ExecutorBackend進程。

4、ExecutorBackend啟動後會向Driver的SchedulerBackend註冊。Driver的DAGScheduler解析作業並生成相應的Stage,每個Stage包含的Task通過TaskScheduler分配給Executor執行。

5、所有stage都完成後作業結束。

簡單理解:

首先Driver和master通信(提交任務,申請資源,傳送driverUrl地址)如 spark-submit xxx.jar --total-executor-cores 2 --executor-memory 512,該命令執行後master會根據提交的信息申請資源;

master主要做幾件事情:1拿出所有workers上的資源;2按照資源的大小進行排序;3按照排序順序取資源;4讓worker啟動executor。

最後把任務換分為stage,將stage添加到taskSet中。循環taskset,將task下發。

深度預警:Spark運行原理

image

Spark在不同集群中的運行架構

Spark 注重建立良好的生態系統,它不僅支持多種外部文件存儲系統,提供了多種多樣的集群運行模式。部署在單臺機器上時,既可以用本地(Local)模式運行,也 可以使用偽分佈式模式來運行;當以分佈式集群部署的時候,可以根據自己集群的實際情況選擇Standalone模式(Spark自帶的模式)、YARN- Client模式或者YARN-Cluster模式。Spark的各種運行模式雖然在啟動方式、運行位置、調度策略上各有不同,但它們的目的基本都是一致 的,就是在合適的位置安全可靠的根據用戶的配置和Job的需要運行和管理Task。

2.1 Spark on Standalone運行過程

Standalone 模式是Spark實現的資源調度框架,其主要的節點有Client節點、Master節點和Worker節點。其中Driver既可以運行在Master 節點上中,也可以運行在本地Client端。當用spark-shell交互式工具提交Spark的Job時,Driver在Master節點上運行;當 使用spark-submit工具提交Job或者在Eclips、IDEA等開發平臺上使用”new SparkConf.setManager(“spark://master:7077”)”方式運行Spark任務時,Driver是運行在本地 Client端上的。

其運行過程如下:

1.SparkContext連接到Master,向Master註冊並申請資源(CPU Core 和Memory);

2.Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啟動StandaloneExecutorBackend;

3.StandaloneExecutorBackend向SparkContext註冊;

4.SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;並且SparkContext解 析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部數據 和shuffle之前產生),然後以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;

5.StandaloneExecutorBackend會建立Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成。

6.所有Task完成後,SparkContext向Master註銷,釋放資源。

深度預警:Spark運行原理

image

2.2 Spark on YARN運行過程

YARN 是一種統一資源管理機制,在其上面可以運行多套計算框架。目前的大數據技術世界,大多數公司除了使用Spark來進行數據計算,由於歷史原因或者單方面業 務處理的性能考慮而使用著其他的計算框架,比如MapReduce、Storm等計算框架。Spark基於此種情況開發了Spark on YARN的運行模式,由於藉助了YARN良好的彈性資源管理機制,不僅部署Application更加方便,而且用戶在YARN集群中運行的服務和 Application的資源也完全隔離,更具實踐應用價值的是YARN可以通過隊列的方式,管理同時運行在集群中的多個服務。

Spark on YARN模式根據Driver在集群中的位置分為兩種模式:一種是YARN-Client模式,另一種是YARN-Cluster(或稱為YARN-Standalone模式)。

2.2.1 YARN框架流程

任何框架與YARN的結合,都必須遵循YARN的開發模式。在分析Spark on YARN的實現細節之前,有必要先分析一下YARN框架的一些基本原理。

Yarn框架的基本運行流程圖為:

深度預警:Spark運行原理

image

其中,ResourceManager負責將集群的資源分配給各個應用使用,而資源分配和調度的基本單位是 Container,其中封裝了機器資源,如內存、CPU、磁盤和網絡等,每個任務會被分配一個Container,該任務只能在該Container中 執行,並使用該Container封裝的資源。NodeManager是一個個的計算節點,主要負責啟動Application所需的 Container,監控資源(內存、CPU、磁盤和網絡等)的使用情況並將之彙報給ResourceManager。ResourceManager與 NodeManagers共同組成整個數據計算框架,ApplicationMaster與具體的Application相關,主要負責同 ResourceManager協商以獲取合適的Container,並跟蹤這些Container的狀態和監控其進度。

2.2.2 YARN-Client

Yarn-Client模式中,Driver在客戶端本地運行,這種模式可以使得Spark Application和客戶端進行交互,因為Driver在客戶端,所以可以通過webUI訪問Driver的狀態,默認是http://hadoop1:4040訪問,而YARN通過http:// hadoop1:8088訪問。

YARN-client的工作流程分為以下幾個步驟:

深度預警:Spark運行原理

image

1.Spark Yarn Client向YARN的ResourceManager申請啟動Application Master。同時在SparkContent初始化中將創建DAGScheduler和TASKScheduler等,由於我們選擇的是Yarn- Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend;

2.ResourceManager收到請求後,在集群中選擇一個NodeManager,為該應用程序分配第一個Container,要求它在這個 Container中啟動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不 運行SparkContext,只與SparkContext進行聯繫進行資源的分派;

3.Client中的SparkContext初始化完畢後,與ApplicationMaster建立通訊,向ResourceManager註冊,根據任務信息向ResourceManager申請資源(Container);

4.一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的 Container中啟動啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟 動後會向Client中的SparkContext註冊並申請Task;

5.Client中的SparkContext分配Task給CoarseGrainedExecutorBackend執 行,CoarseGrainedExecutorBackend運行Task並向Driver彙報運行的狀態和進度,以讓Client隨時掌握各個任務的 運行狀態,從而可以在任務失敗時重新啟動任務;

6.應用程序運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉自己。

2.2.3 YARN-Cluster

在 YARN-Cluster模式中,當用戶向YARN中提交一個應用程序後,YARN將分兩個階段運行該應用程序:第一個階段是把Spark的Driver 作為一個ApplicationMaster在YARN集群中先啟動;第二個階段是由ApplicationMaster創建應用程序,然後為它向 ResourceManager申請資源,並啟動Executor來運行Task,同時監控它的整個運行過程,直到運行完成。

YARN-cluster的工作流程分為以下幾個步驟:

深度預警:Spark運行原理

image

1.Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啟動ApplicationMaster的命令、需要在Executor中運行的程序等;

2.ResourceManager收到請求後,在集群中選擇一個NodeManager,為該應用程序分配第一個Container,要求它在這個 Container中啟動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始 化;

3.ApplicationMaster向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將採用輪詢的方式通過RPC協議為各個任務申請資源,並監控它們的運行狀態直到運行結束;

4.一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的 Container中啟動啟動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟 動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式一樣,只不過 SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行 任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏 輯等;

5.ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執 行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓 ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務;

6.應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉自己。

2.2.4 YARN-Client 與 YARN-Cluster 區別

理 解YARN-Client和YARN-Cluster深層次的區別之前先清楚一個概念:Application Master。在YARN中,每個Application實例都有一個ApplicationMaster進程,它是Application啟動的第一個 容器。它負責和ResourceManager打交道並請求資源,獲取資源之後告訴NodeManager為其啟動Container。從深層次的含義講 YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別。

  • YARN- Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的運行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上運行,因而 YARN-Cluster模式不適合運行交互類型的作業;
  • YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通信來調度他們工作,也就是說Client不能離開。
https://www.jianshu.com/p/090bc81a25c3


分享到:


相關文章: