1. 程式人生 > >Spark技術架構,概念及執行過程

Spark技術架構,概念及執行過程

1.Spark技術架構

  • Spark分散式記憶體計算平臺採用的是Master-Slave架構,叢集中含有Master程序的節點ClusterManager即為這裡的Master,而Slave則是叢集中的Work程序節點。
  • Master作為整個叢集的控制器,負責整個叢集的正常執行,Worker則相當於是計算節點,接收主節點的命令,執行Driver或Excutor,並進行狀態彙報;Executor執行在Worker節點。
  • 在Yarn執行框架下,由Yarn的ResourceManager擔任Master,Excutor則執行在NodeManager的Container中。
  • Spark的提交執行流程:Spark作業在提交執行時,會指定master和deploy-mode兩個引數,共同決定了是standalone還是yarn/mesos資源管理託管模式。
  • master引數包括:spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local,預設為local[*]
  • deploy-mode引數取值為client和cluster,分別意味著driver程式執行在哪裡,預設為client
  • master取值local[n]:單機執行 spark://xxx在指定叢集上執行 yarn則為執行在yarn叢集中,yarn-cluster和yarn-client在spark2.0已經不推薦使用了,需要通過master和deploy-mode共同指定
    // Set the cluster manager
val clusterManager: Int = args.master match { case "yarn" => YARN //yarn-client和yarn-cluster已不推薦使用 case "yarn-client" | "yarn-cluster" => printWarning(s"Master ${args.master} is deprecated since 2.0." + " Please use master \"yarn\" with specified deploy mode instead."
) //當前真要用了其實還是當做YARN來對待 YARN //spark://xxx 對應到STANDALONE case m if m.startsWith("spark") => STANDALONE case m if m.startsWith("mesos") => MESOS case m if m.startsWith("local") => LOCAL case _ => printErrorAndExit("Master must either be yarn or start with spark, mesos, local") -1 } // Set the deploy mode; default is client mode var deployMode: Int = args.deployMode match { case "client" | null => CLIENT case "cluster" => CLUSTER case _ => printErrorAndExit("Deploy mode must be either client or cluster"); -1 }
  • Spark的任務流程:
Created with Raphaël 2.1.2Client作為客戶端提交應用[Master]找到一個Worker啟動Driver(或者本地啟動Driver)[Driver]向Master申請資源,之後將應用轉化為RDD Graph[DAGScheduler]將RDD Graph轉化為Stage後提交給TaskScheduler[TaskScheduler]提交給Executor執行結束

2.Spark的基本概念

2.1 Application

使用者寫的spark程式,提交後為一個App,一個App內僅有一個SparkContext,此即App的Driver,驅動著整個App的執行。

2.2 Job

一個App內有多個Action運算元,這些action運算元觸發了RDD/Dataset的轉換,每個action對應著一個Job

2.3 Stage和DAGSchedule

Job的執行過程中根據shuffle的不同,分成了寬依賴和窄依賴,DAGSchedule據此講Job分成了不同的Stage,並將其提交給TaskSchedule執行

2.4 Task和TaskSchedule

Task為具體執行任務的基本單位,被TaskSchedule分發到excutor上執行

2.5 BlockManager

管理App執行過程中的中間資料,如記憶體磁碟等,cache/persist等的管理均通過BlockManager進行維護

2.6 寬依賴與窄依賴

RDD/DF等記憶體塊均是隻讀的,RDD的生成(除最初建立)靠的也是老RDD的轉換,所以RDD間通過這些依賴產生了關係。如果一個父RDD的每個分割槽只被子RDD的一個分割槽依賴,那這是窄依賴,相反如果子RDD的任意個分割槽的生成都依賴父RDD的每個分割槽,則為寬依賴。顯而易見,寬依賴影響很大。而在連續的多個窄依賴間因都是在同一個分割槽內,所以可連續多次處理而不用寫磁碟提高效率。DAG的Stage劃分也據此講一個Job劃分為了多個Stage,保證在每個Stage內是窄依賴。

3. 執行過程

3.1 Standalone

  1. 構建SparkApplication的執行環境(啟動SparkContext)
  2. SparkContext向資源管理器(Standalone的Master)申請執行Executor資源,並啟動StandaloneExecutorBackend
  3. Executor向SparkContext註冊
  4. SparkContext啟動應用程式DAG排程、Stage劃分,TaskSet生成
  5. TaskScheduler排程Taskset,將task發放給Executor執行。
  6. Task在Executor上執行,執行完畢釋放所有資源。
    這裡寫圖片描述

3.2 yarn cluster

圖中已經很清楚了
yarn-cluster mode