Spark是基於內存計算的大數據分佈式計算框架。Spark基於內存計算,提升了在大數據環境下數據處理的實時性,同時保證了高容錯性和高可伸縮性。
在Spark中,經過RDD(Resilient Distributed Dataset,彈性分佈式數據集)來進行計算,這些分佈式集合,並行的分佈在整個集羣中。RDDs是Spark分發數據和計算的基礎抽象類。
RDD屬性:java
Spark術語node
Application:用戶自定義的Spark程序,用戶提交後,Spark爲App分配資源將程序轉換並執行。
Driver Program:運行Application的main()函數而且建立SparkContext。
SparkContext:是用戶邏輯與Spark集羣主要的交互接口,它會和Cluster Manager進行交互,負責計算資源的申請等。
Cluster Manager:資源管理器,負責集羣資源的管理和調度,支持的有:Standalone,Mesos和YARN。在standalone模式中即爲Master主節點,控制整個集羣,監控Worker。在YARN模式中爲資源管理器。
Worker Node:從節點,負責控制計算節點,啓動Executor或Driver。在YARN模式中爲NodeManager,負責計算節點的控制。
Executor:執行器,是爲某Application運行在worker node上的一個進程,該進程裏面會經過線程池的方式負責運行任務,並負責將數據存在內存或者磁盤上。每一個Application擁有獨立的一組executors。
RDD DAG:當RDD遇到Action算子,將以前的全部算子造成一個有向無環圖(DAG)。再在Spark中轉化爲Job,提交到集羣進行執行。一個App能夠包含多個Job。
Job:一個RDD Graph觸發的做業,每每由Spark Action算子觸發,在SparkContext中經過runJob()向Spark提交Job。
Stage:每一個Job會根據RDD的寬依賴關係被切分紅不少Stage,每一個Stage中包含一組相同的Task,這一組Task也叫TaskSet。
Task:一個分區對應一個Task,Task執行RDD中對應Stage中所包含的算子。Task被封裝好後放入Executor的線程池中執行。
DAG Scheduler:根據Job構建基於Stage的DAG,並提交Stage給TaskScheduler。
TaskScheduler:將Task分發給Executor執行。
SparkEnv:線程級別的上下文,存儲運行時的重要組件的引用。
編程
Client提交Application,用戶程序中會建立一個SparkContext,新建立的SparkContext會根據用戶在編程的時候設置的參數,或者是系統默認的配置鏈接到Cluster Manager上。
Cluster Manager找到一個Worker啓動Driver,Driver向Cluster Manager或者資源管理器申請資源,以後將應用轉化爲RDD Graph,再由DAGScheduler將RDD Graph轉化爲Stage的有向無環圖(taskset)提交給TaskScheduler,由TaskScheduler提交任務(Task)給Executor進行執行。
Executor在接收到Task以後,會下載Task的運行時依賴的包和庫,準備好Task運行環境所須要的信息以後,就會在線程池中執行task。task在運行的時候會把狀態以及結果彙報給Driver。
Driver會根據收到的Task的運行狀態處理不一樣的狀態更新,Task分爲兩種,一種是Shuffle Map Task,它實現數據的重新洗牌,在全部stage中,除最後一個以外,全部的stage都成爲Shuffle階段,結果會保存在Executor的本地文件系統中,另外一種,也就是最後一個stage稱爲:result Task,它負責生成結果數據。
Driver會不斷的調用Task,將Task發送到Executor執行,在全部的Task都正確執行或者超過執行次數的限制仍然沒有執行成功時中止。
注意:Spark程序是在註冊時完成資源分配的。在Worker上啓動Executor,分配多少core,這些內容都是在程序啓動初始化的時候完成的,而不是在工做過程當中完成的。程序向Master註冊,Master分配資源後交給 CoarseGrainedSchedulerBackend下的子類:SparkDeploySchedulerBackend 管理。而後是Driver的DAG的劃分,而後交給DAG Scheduler(Standalone模式下就是TaskSchedulerImpl),TaskSchedulerImpl經過SchedulerBackend得到資源,把具體的任務分配到具體的機器(Executor)上。架構