內部運行機制
任務分配、IO模塊、通信控制模塊、容錯模塊、Shuffle模塊。採用的算法:FIFO、FIAR算法,通信採用AKKA框架
1、spark執行機制:
spark應用提交後經歷了一系列轉換最後成爲Task在每個節點上執行。
大體的執行流程:RDD的Actions操作除非Job的提交,提交到spark中的job生成RDD DAG,由DAG Scheduler轉換爲stage中的task集合,再由TaskScheduler將任務分發到Executor執行,會在Executor中創建線程池,併發執行。
1)spark Application
Application應用程序是用戶提交的應用程序,spark的應用程序運行方式可分爲cluster模式和client模式。Application包含的組件有:
Application:用戶自定義的應用程序,執行後,spark爲其分配資源,將程序轉換並且執行。
Driver program:運行main()函數並創建SparkContext
RDD graph: 核心步驟。當碰到Action算子時,將前面所有的算子形成DAG圖,轉化爲Job後提交到集羣執行。
Job:RDD DAG觸發的作業,一般由Action算子觸發,通過runJob的方法向Spark提交job
Stage:每個Job根據Rdd的寬依賴關係被切分成多個Stage。每個Stage中包含一組相同的Task
Task:一個分區對應一個Task,Task執行RDD中對應stage中包含的算子。Task被封裝好後放入Executor中的線程池中執行。
2)應用提交與執行方式
兩種方式:1、Drive運行在客戶端,管理監控應用的情況。2、主節點指定某個Worker節點啓動Driver,負責整個應用的監控。
第一種方式:用戶啓動客戶端後在客戶端上運行程序,Driver進程啓動,在Driver中啓動或者實例化DAGScheduler,客戶端的Driver向Master註冊,Master命令Worker啓動Executor。Executor通過創建線程啓動相關的其他進程
第二種方式:需要通過org.apache.spark.deploy.Client類執行應用:流程:1用戶啓動客戶端,客戶端提交應用程序給Master。2Master調度應用,針對每個應用分發給指定的一個Worker啓動Driver。3ExecutorBackend啓動後,向Driver的SchedulerBackend註冊,這樣Driver獲取了計算資源就可以調度和將任務分發到計算節點執行。
2、Spark調度與任務分配模塊
調度級別:Application調度、Job的調度、Stage的調度、Task的調度
1)Spark應用程序調度:靜態配置資源分配規則,配置每個應用可以使用的最大資源總量、優先級等。
根據不同的集羣模式進行配置調度。
2)應用程序內Job的調度:用戶通過不同線程提交的Job可以並行運行,spark的調度器是完全線程安全的,支持一個應用處理多請求的用例。默認情況下以FIFO方式調度Job的執行。
3)stage和TaskSetManager的調度
3、spark I/O機制
由傳統IO演化而來
由來:spark數據分區都是分散在多個計算機系統中的,傳統的數據是存在一個主機中。
spark數據量巨大,TB、PB級。不僅要考慮本地主機的IO開銷,還要考慮數據在不同主機之間傳輸的IO開銷,同時spark對數據的尋址方式也需要改變,以應對大數據挑戰。
1)序列化,是將對象轉換成字節流的操作。spark可以採用Java的序列化庫,也可以採用Kyro序列化庫。
2)壓縮:當大片連續區域進行存儲且存儲區域中數據重複性高的狀況下,數據適合進行壓縮。序列化之後的數據可以進行壓縮以減少空間開銷。壓縮採用兩種方式Snappy和LZF.
在spark程序中使用壓縮:兩種方式配置壓縮。spark-env.sh中配置壓縮配置的參數;在應用程序sparkContext對象conf中配置參數。
3)spark塊管理:
4、Spark通信模塊
RPC
RMI
JMS
eJB
WebService
Spark中使用的通信框架是AKKA框架,基於scala開發,用於編寫Actor應用。
5、容錯機制
一般來說,分佈式的容錯性有兩種方式:數據檢查點和記錄數據的更新。數據檢查點操作成本很高,Spark採取記錄數據更新的方式。
6、Shuffle機制
本質是洗牌、混洗,即把一組有一定規則的數據打散重新組合成一組無規則隨機數據分區。