我們知道Spark總是以集群的方式運行的,Standalone的部署方式是集群方式中最為精簡的一種(另外的是Mesos和Yarn)。Standalone模式中,資源調度是自己實現的,是MS架構的集群模式,故存在單點故障問題。
下面提出幾個問題並解決:
1、Standalone部署方式下包含哪些節點?
由不同級別的三個節點組成,分別是Master主控節點、Worker工作節點、客戶端節點;
(1)其中Master主控節點,顧名思義,類似於領導者,在整個集群中,最多只有一個Master處於Active狀態。在使用spark-shell等交互式運行或者使用官方提供的run-example實例時,Driver運行在Master節點中;若是使用spark-submit工具進行任務的提交或者IDEA等工具開發運行任務時,Driver是運行在本地客戶端的。
Master一方面負責各種信息,比如Driver、Worker、Application的注冊;另一方面還負責Executor的啟動,Worker心跳等諸多信息的處理。
(2)Woker節點,類似於yarn中的NodeManager,在整個集群中,可以有多個Worker(>0)。負責當前WorkerNode上的資源匯報、監督當前節點運行的Executor。並通過心跳機制來保持和Master的存活性連接。Executor受到Worker掌控,一個Worker啟動Executor的個數受限於 機器中CPU核數。每個Worker節點存在一個多個CoarseGrainedExecutorBackend進程,每個進程包含一個Executor對象,該對象持有一個線程池,每個線程執行一個Task。
2、基本的概念?
- (1)Application:指的是用戶編寫的Spark應用程序,包含了含有一個Driver功能的代碼和分布在集群中多個節點上運行的Executor代碼。
- (2)Driver:運行Application的main函數並創建SparkContext,SparkContext的目的是為了准備Spark應用程序的運行環境。SparkContext負責資源的申請、任務分配和監控等。當Executor運行結束后,Driver負責關閉SparkContext;
- (3)Job:一個Application可以產生多個Job,其中Job由Spark Action觸發產生。每個Job包含多個Task組成的並行計算。
- (4)Stage:每個Job會拆分為多個Task,作為一個TaskSet,稱為Stage;Stage的划分和調度是由DAGScheduler負責的。Stage分為Result Stage和Shuffle Map Stage;
- (5)Task:Application的運行基本單位,Executor上的工作單元。其調度和 管理又TaskScheduler負責。
- (6)RDD:Spark基本計算單元,是Spark最核心的東西。表示已被分區、被序列化、不可變的、有容錯機制的、能被並行操作的數據集合。
- (7) DAGScheduler:根據Job構建基於Stage的DAG,划分Stage依據是RDD之間的依賴關系。
- (8)TaskScheduler:將TaskSet提交給Worker運行,每個Worker運行了什么Task於此處分配。同時還負責監控、匯報任務運行情況等。
3、Standalone啟動過程是啥?
(1)首先,啟動master,worker節點。
worker啟動后觸發Master的RegisterWorker事件,進行注冊。主要講要注冊的Worker信息封裝成WorkerInfo對象,包括Worker節點的CPU、內存等基本信息。記錄Worker的信息(IP、Address)到master緩存中(HashMap),若Worker節點的注冊信息有效,持久化已注冊的Worker信息。然后給個完成注冊的反饋信號。
(2)提交Application
運行spark-shell時,會由Driver端的DAGScheduler向Master發送RegisterApplication請求。根據此請求信息會創建ApplicationInfo對象,將Application加入到Master的緩存apps中,這個結構是HashSet。
如果worker已經注冊,發送lanchExecutor指令給相應的Worker。
(3)Worker收到lanchExecutor后,會由ExecutorRunner啟動Excutor進程,啟動的Executor進程會根據啟動時的入參,將自己注冊到Drive中的ScheduleBackend。
(4)ScheduleBackend收到Excutor的注冊信息后,會將提交到的Spark Job分解為多個具體的Task,然后通過LaunchTask指令將這些Task分散到各個Executor上運行。
4、Standalone部署方式下某一節點出現問題時,系統如何處理?
出現問題的節點可能發生的情況有三種:
(1)Master崩掉了:這個壞掉了,就真的沒法完了。單點故障的問題。
有兩種解決辦法:第一種基於文件系統的故障恢復,適合Master進程本身掛掉,那直接重啟就Ok了。
第二種是基於ZookerKeep的HA方式。此方式被許多的分布式框架使用。
(2)某一Worker崩掉了:
若是所有的Worker掛掉,則整個集群就不可用;
Worker退出之前,會將管控的所有Executor進程kill;由於Worker掛掉,不能向master玩心跳了,根據超時處理會知道Worker掛了,然后Master將相應的情況匯報給Driver。Driver會根據master的信息和沒有收到Executor的StatusUpdate確定這個Worker掛了,則Driver會將這個注冊的Executor移除。
(3)某Worker的Excutor崩掉了:
Excutor的作為一個獨立的進程在運行,由ExcutorRunner線程啟動,並收到ExcutorRunner的監控,當Excutor掛了,ExcutorRunner會注意到異常情況,將ExecutorStateChanged匯報給Master,master會再次發送lanchExecutor指令給相應的Worker啟動相應的Excutor。
