?Spark框架的核心是一個計算引擎,整體來說,它采用了標準master-slave的結構
?如下圖所示,它展示了一個Spark執行時的基本結構,圖形中的Driver表示master,負責管理整個集群中的作業任務調度,圖形中的Executor則是slave,負責實際執行任務。
由上圖可以看出,對于Spark框架有兩個核心組件:
Driver
Spark驅動器節點,用于執行Spark任務中的main方法,負責實際代碼的執行工作 ,Driver在Spark作業執行時主要負責;
- 將用戶程序轉化為作業(job)
- 在Executor之間調度任務(task)
- 跟蹤Executor的執行情況
- 通過UI展示查詢運行情況
實際上,我們無法準確地描述Driver的定義,因為在整個的編程過程中沒有看到任務有關Driver的字眼,所以簡單理解,所謂的Driver就是驅使整個應用運行起來的程序,也稱之為Driver類
Executor
?Spark Executor是集群中工作節點(Worker)中的一個JVM進程,負責在Spark作業中運行具體任務(Task),任務彼此之間相互獨立,Spark應用啟動時,Executor節點被同時啟動,并且始終伴隨著整個Spark應用的生命周期而存在,如果有Executor節點發生了故障或者崩潰,Spark應用也可以繼續執行,會將出錯節點上的任務調度到其他Executor節點上繼續運行。
?Executor有兩個核心功能
- 負責運行組成Spark應用的任務,并將結果返回給驅動器進程
- 他們通過自身的塊管理器為用戶程序中要求緩存的RDD提供內存式存儲,RDD是直接緩存在Executor進程內的,因此任務可以在運行時充分利用緩存數據加速運算
Master & Worker
?Spark集群的獨立部署環境中,不需要依賴其他的資源調度框架,自身就實現了資源調度的功能,所以環境中還有其他兩個核心組件:Master和Worker,這里的Master是一個進程,主要負責資源的調度和分配,并進行集群的監控等職責,類似于Yarn環境中的RM,而Worker也是進程,一個Worker運行在集群中的一臺服務器上,由Master分配資源對數據進行并行的處理和計算,類似于Yarn環境中NM
ApplicationMaster
?Hadoop用戶向Yarn集群提交應用程序時,提交程序中應該包含ApplicationMaster,用于向資源調度器申請執行任務的資源容器Container,運行用戶自己的程序任務job,監控整個任務的執行,跟蹤整個任務的狀態,處理任務失敗等異常情況
?說的簡單點就是,ResourceManager(資源)和Driver(計算)之間的解耦合靠的就是ApplicationMaster
Executor與Core
?Spark Executor是集群中運行在工作節點(Worker)中的一個JVM進程,是整個集群中的專門用于計算的節點,在提交應用中,可以提供參數指定計算節點的個數,以及對應的資源,這里的資源一般指的是工作節點Executor的內存大小和使用虛擬核(Core)數量。
應用程序相關啟動參數如下:
名稱 | 說明 |
---|---|
–num-executors | 配置Executor的數量 |
–executor-memory | 配置每個Executor的內存大小 |
–executor-cores | 配置每個Executor的虛擬CPU core數量 |
并行度
?在分布式計算框架中一般都是多個任務同時執行,由于任務分布在不同的計算節點進行計算,所以能夠真正地實現多任務并行執行,我們將整個集群并行執行任務的數量稱之為并行度,那么一個作業到底并行度是多少呢?這個取決于框架的默認配置,應用程序也可以在運行過程中動態修改。
Spark核心編程
Spark計算框架為了能夠進行高并發和高吞吐的數據處理,封裝了三大數據結構,用于處理不同的應用場景,三大數據結構分別是:
- RDD:彈性分布式數據集
- 累加器:分布式共享只寫變量
- 廣播變量:分布式共享只讀變量