部署方式有:Standalone(Spark的Deploy模塊)、Mesos、YARN、EC2、Local
SparkContext創建時,通過傳入的Master URL不同,創建不同的SchedulerBackend和TaskScheduler,在spark.SparkContext#createTaskSchuster實現
Master URL:
local:以一個工作線程運行計算任務,不重新計算失敗的計算任務
local[N]/[*]:N個線程,或是啟動與CPU core相等數量的線程,也是不會重新計算失敗
local[threads, maxFailures]:設置線程數與最大的失敗重試數
local-cluster[numSlaves, coresPerSlave, memoryPerSlave]:本機運行Master和Worker,三個參數分別設置worker的數量、core數、內存
前三種方式,SchedulerBackend的實現是scheduler.local.LocalBackend,TaskScheduler的實現是scheduler.TaskSchedulerImpl,它也有LocalActor,通過這個與Executor
第四種為偽分布式,和Standalone類似,只不過都運行在同一個機器。SB的實現是scheduler.cluster.SparkDeploy-SchedulerBackend,TS的實現是scheduler.Task-SchedulerImpl
Worker接到Master的LaunchExecutor信息后,創建實例ExecutorRunner,啟動一個新的進程,它的實現是spark.executor.Coarse-GrainedExecutorBackend。它不在Worker進程內
Local-cluster可以啟動多個Worker
Mesos:采用Master/Slave架構,主要由Master、Slave、Framework、Executor組成,通過ZooKeeper實現Master高可用
Mesos資源調度分為粗粒度與細粒度調度
粗粒度就是每個Executor獲得資源就長期持有,直到應用程序退出才釋放。優點是減少資源調度的開銷,缺點就是資源被長期占有,會造成資源浪費
細粒度就是根據任務實際動態申請,避免了資源浪費,但同時調度的時間開銷更大
通過spark.mesos.coarse來設置是粗還是細
YARN:重點關注一下
YARN包括ResourceManager負責全局管理所有應用的計算資源分配,每一臺機器的NodeManager管理應用在這臺機器上的進程并組織計算
ApplicationMaster負責調度和協調,結合從RM獲得的資源和NM協同工作,每一個應用對應的AM的職責有向調度器索取、運行任務、跟蹤與監控狀態和進程、處理任務失敗
RM不對應用進行監控和跟蹤,是基于應用程序的純粹調度器,把資源分給多個隊列和應用
NM是每臺機器框架的代理,是執行應用程序的容器,監控應用程序的資源使用并向調度器匯報
過程:Client提交Job后,AM向RM請求資源,獲得后AM在NM上啟動Container,運行計算任務,并監控任務(一個應用對應一個AM,而一個AM對應管理多個NM)
YARN的Cluster模式:
通過YARN調度Spark Application所需資源。Application通過YARN Client提交到RM,RM在一個工作節點啟動AM(注冊為YARN ApplicationMaster),開始應用的提交(spark.deploy.yarn.ApplicationMaster)
TaskScheduler的實現是spark.scheduler.cluster.YarnClusterScheduler,它完成了AM的初始化。AM通過RM和NM的接口啟動若干個容器作為spark.executor.CoarseGrainedExecutorBackend,最終啟動Executor
YARN的Client模式:
與Cluster模式區別在于提交Application的SparkContext在本地,適合Application需要與本地交互的場景;Cluster模式是計算的全部節點都在YARN節點上進行。
SparkContext創建spark.scheduler.cluster.YarnClient-ClusterScheduler和spark.scheduler.cluster.YarnClientSchedulerBackend,分別是兩個模塊的實現。其中SchedulerBackend可以和ExecutorBackend通過AKKA通信,并向RM提交Application,AM負責在多個節點上啟動Executor
Standalone:
Master/Slave架構,Master負責整個集群的資源調度和Application管理,Slave(Worker)接收Master資源調度命令后啟動Executor,并最終完成計算任務。
Client負責Application的創建和向Master注冊,并接收Executor的狀態更新和計算結果。
Master、Worker、Client都是通過AKKA通信,Master和Worker都是一個Actor
Master:接收Worker注冊并管理所有Worker,接收Client提交Application,并提交給Worker
Worker:向Master注冊自己,根據Master發送的Application配置進程環境,并啟動StandaloneExecutorBackend
Client:向Master注冊并監控Application。創建SparkContext時生成SparkDeploySchedulerBackend,就會向Master發送請求了
Standalone模式是通過Spark的Deploy模塊就能實現,部署簡單,有利于推廣Spark
得到計算資源Executor,Task就到達了真正計算的步驟。