[SparkContext]
連接到spark集羣,入口點.
[HadoopRDD]
讀取hadoop上的數據,
[MapPartitionsRDD]
針對父RDD的每個分區提供了函數構成的新類型RDD.
[PairRDDFunctions]
對偶RDD函數類。
可用於KV類型RDD的附加函數。可以通過隱式轉化得到.
[ShuffleRDD]
從Shuffle中計算結果的RDD.
[RDD]
是分區的集合.
彈性分佈式數據集.
不可變的數據分區集合.
基本操作(map filter , persist)
分區列表 //數據
應用給每個切片的計算函數 //行爲
到其他RDD的依賴列表 //依賴關係
(可選)針對kv類型RDD的分區類
(可選)首選位置列表
[DAGScheduler]
高級調度器層面,實現按照階段(stage),shuffle按照.
對每個JOB的各階段計算有向無環圖(DAG),並且跟蹤RDD和每個階段的輸出。
找出最小調度運行作業,將Stage對象以TaskSet方式提交給底層的調度器。
底層調度器實現TaskScheduler,進而在cluster上運行job.
TaskSet已經包含了全部的單獨的task,這些Task都能夠基於cluster的數據進行
正確運行。
Stage通過在需要shuffle的邊界處將RDD打碎來創建Stage對象。
具有'窄依賴'的RDD操作(比如map /filter)被管道化至一個taskset中.
而具有shuffle依賴的操作則包含多個Stage(一個進行輸出,另一個進行輸入)
最會,每個stage都有一個針對其他stage的shuffle依賴,可以計算多個操作。
Dag調度器檢測首選位置來運行rask,通過基於當前的緩存狀態,並傳遞給底層的
task調度器來實現。根據shuffle的輸出是否丟失處理故障問題。
不是由stage內因爲丟失文件引發的故障有task調度處理。在取消整個stage之前,
task會進行少量次數的重試操作。
爲了容錯,同一stage可能會運行多次,稱之爲"attemp",如果task調度器報告了一個故障(該
故障是由於上一個stage丟失輸出文件而導致的)DAG調度就會重新提交丟失的stage。這個通過
具有 FetchFailed的CompletionEvent對象或者ExecutorLost進行檢測的。
DAG調度器會等待一段時間看其他節點或task是否失敗,然後對丟失的stage重新提交taskset,
計算丟失的task。
術語介紹
[job]
提交給調度的頂層的工作項目,由ActiveJob表示。
是Stage集合。
[Stage]
是task的集合,計算job中的中間結果。同一RDD的每個分區都會應用相同的計算函數。
在shuffle的邊界處進行隔離(因此引入了隔斷,需要上一個stage完成後,才能得到output結果)
有兩種類型的stage:1)ResultStage,用於執行action動作的最終stage。2)ShuffleMapStage,
對shuffle進行輸出文件的寫操作的。如果job重用了同一個rdd的話,stage通常可以跨越多個
job實現共享。
並行任務的集合,都會計算同一函數。所有task有着同樣的shuffle依賴,調度器運行的task DAG
在shuffle邊界處劃分成不同階段。調度器以拓撲順序執行.
每個stage可以shuffleMapStage,該階段下輸出是下一個stage的輸入,也可以是resultStage,該階段
task直接執行spark action。對於shuffleMapStage,需要跟蹤每個輸出分區所在的節點。
每個stage都有FirstJobId,區分於首次提交的id
[ShuffleMapStage]
產生輸出數據,在每次shuffle之前發生。內部含有shuffleDep字段,有相關字段記錄產生多少輸出
以及多少輸出可用。
DAGScheduler.submitMapStage()方法可以單獨提交ubmitMapStage().
[ResultStage]
該階段在RDD的一些分區中應用函數來計算Action的結果。有些stage並不會在所有分區上執行。
例如first(),lookup();
[Task]
單獨的工作單元,每個發送給一臺主機。
[Cache tracking]
Dag調度器找出哪些RDD被緩存,避免不必要的重複計算,同時,也會記住哪些shuffleMap已經輸出了
結果,避免map端shuffle的重複處理。
[Preferred locations]
dag調度器根據rdd的中首選位置屬性計算task在哪裏運行。
[Cleanup]
運行的job如果完成就會清楚數據結構避免內存泄漏,主要是針對耗時應用。
[ActiveJob]
在Dag調度器中運行job。作業分爲兩種類型,1)result job,計算ResultStage來執行action.
2)map-state job,爲shuffleMapState結算計算輸出結果以供下游stage使用。
主要使用finalStage字段進行類型劃分。
job只跟蹤客戶端提交的"leaf" stage,通過調用Dag調度器的submitjob或者submitMapStage()方法實現.
job類型引發之前stage的執行,而且多個job可以共享之前的stage。這些依賴關係由DAG調度器內部管理。
[LiveListenerBus]
異步傳輸spark監聽事件到監聽器事件集合中。
[EventLoop]
從caller接受事件,在單獨的事件線程中處理所有事件,該類的唯一子類是DAGSchedulerEventProcessLoop。
[LiveListenerBus]
監聽器總線,存放Spark監聽器事件的隊列。用於監控。
[OutputCommitCoordinator]
輸出提交協調器.決定提交的輸出是否進入hdfs。
[TaskScheduler]
底層的調度器,唯一實現TaskSchedulerImpl。可插拔,同Dag調度器接受task,發送給cluster,
運行任務,失敗重試,返回事件給DAG調度器。
[TaskSchedulerImpl]
TaskScheduler調度器的唯一實現,通過BackendScheduler(後臺調度器)實現各種類型集羣的任務調度。
[SchedulerBackend]
可插拔的後臺調度系統,本地調度,mesos調度,。。。
在任務調度器下方,
實現有三種
1.LocalSchedulerBackend
本地後臺調度器
啓動task.
2.StandaloneSchedulerBackend
獨立後臺調度器
3.CoarseGrainedSchedulerBackend
粗粒度後臺調度器
[Executor]
spark程序執行者,通過線程池執行任務。