Spark核心組件
1、RDD
resilient distributed dataset, 彈性分布式數據集。邏輯上的組件,是spark的基本抽象,代表不可變,分區化的元素集合,可以進行並行操作。該類封裝了RDD的基本操作,例如map、filter、persist等,除此以外,PairRDDFunctions封裝了KV類型RDD的操作,例如groupByKey和join。對於spark的KV類型RDD直接隱式轉換成PairRDDFunctions類,具備了byKey的操作。
RDD輕量級集合,內部沒有數據。內部,每個RDD具有5方面主要屬性:
- 分區列表
- 用於計算每個切片的函數(算法)
- 到其他RDD的依賴列表
- (可選)對於KV類型的RDD有一個分區類
- (可選)計算每個切片的首選位置列表
spark中所有的調度和執行都是基於這些方法,也允許每個RDD實現自己的計算方式。RDD的方法主要包含兩種類型Transformations和action。返回rdd都是變換,不會導致job的執行,延遲計算,延遲到action方法的調用。
1.1 transform
- map
- filter
- mapValues
- flatMap
- reduceByKey
- groupByKey
- sortByKey
2、SparkContext
上下文創建時,在worker節點直接啟動job的執行器進程(CoarseGrainedExecutorBackend),spark入口點,表示到spark集群的一個連接。創建該類時,同時創建task調度器和后台調度器,后台調度器還要決定默認並發度問題。
3、DagScheduler
高級調度層,面向stage進行調度,為每個job計算stage,尋找最優路徑執行job。該調度器以taskset方式提交stage給下層調度器(TaskScheduler)。Spark以shuffle為邊界,將眾多的RDD划分成stage,窄依賴的RDD划分到一個stage中。shuffle依賴需要多個stage,DAG調度檢測運行task的首選位置,該調度器將位置信息和狀態傳遞給底層的task調度器。DAG調度器處理因shuffle output丟失導致故障,此時上一個stage需要重新提交。在階段stage內,不是由shuffle output丟失導致的故障都由下層的task調度器處理。緩存跟蹤,避免rdd重復計算。首選位置:首選那個節點來執行task。為了防止內存泄漏,job完成后清除數據結構。遞歸提交每個Stage,每個stage都是以Tasket方式提交任務集合給下層的TaskScheduler,因此Dag調度器需要計算每個stage的任務集合。提交的階段通過分區列表映射成Task集合,ShuffleMapStage對應ShuffleTask,ResultStage對應
ResultTask。
4、TaskSchedulerImpl
5、SchedulerBackend
6、job
activejob,提交給調度器的最頂層work單位,每個job可能需要多各stage的執行,並產生中間結果。
7、stage
stage是task的集合,數量同stage的最后的一個rdd的分區數相同。stage按照shuffle進行划分邊界,存在前后依賴,上一階段計算輸出,下一個提取上一個的結果。主要有兩種類型stage:
- ResultStage
最后的階段,執行action。在RDD的某些分區上應用函數來計算action的結果。 - ShuffleMapStage
產生map的output,stage如果重用了rdd,可以跨job共享。該階段是DAG圖計算過程中的中間階段,執行時保存輸出文件供reduce任務抓取,該階段可以單獨提交,DagScheduler.submitMapStage();