RDD(Resilient Distributed Datasets),彈性分佈式數據集,它是對分佈式數據集的一種內存抽象,經過受限的共享內存方式來提供容錯性,同時這種內存模型使得計算比傳統的數據流模型要高效。RDD具備5個重要的特性,以下圖所示:多線程
1.一組分區,數據集的基本組成單位。
2.計算每個數據分區的函數。
3.對parent RDD的依賴,這個依賴描述了RDD之間的lineage(血統)。
4.可選,對於鍵值對RDD,有一個Partitioner(一般是HashPartitioner,RangePartitioner)。
5.可選,一組Preferred location信息(例如,HDFS文件的Block所在location信息)。架構
用戶在提交任務給Spark處理時,如下兩個參數共同決定了Spark的運行方式。 · –master MASTER_URL :決定了Spark任務提交給哪一種集羣處理。 · –deploy-mode DEPLOY_MODE:決定了Driver的運行方式,可選值爲Client或者Cluster。
Spark 運行架構的特色
每一個Application獲取專屬的executor進程,該進程在Application期間一直駐留,並以多線程方式運行Tasks。這種Application隔離機制有其優點的,不管是從調度角度看(每一個Driver調度它本身的任務),仍是從運行角度看(來自不一樣Application的Task運行在不一樣的JVM中)。固然,這也意味着Spark Application不能跨應用程序共享數據,除非將數據寫入到外部存儲系統。併發
Spark與資源管理器無關,只要可以獲取Executor進程,並可以保持相互通訊就能夠了。框架
提交SparkContext的Client應該靠近Worker節點(運行Executor的節點),最好是在同一個機架裏,由於Spark Application運行過程當中SparkContext和Executor之間有大量的信息交換;若是想在遠程集羣中運行,最好使用RPC將SparkContext提交給集羣,不要遠離Worker運行SparkContext。分佈式
專屬名稱:
Application:每個Spark程序,稱之爲一個Application。
Driver:每一個Spark程序運行一個Driver進程,用來協調,統計任務進度。
Worker:每一個Spark程序運行多個Worker進程,能夠運行在一個節點或多個節點上,包含多個Executor子進程。
Executor:每一個Spark程序運行多個Executor進程,具體承擔計算任務。
函數
Standalone 運行模式
Spark Standalone模式,即獨立模式,自帶完整的服務,可單獨部署到一個集羣中,無需依賴其餘資源管理系統(資源管理+資源調度)。在該模式下,用戶能夠經過手動啓動Master和Worker來啓動一個獨立的集羣。其中,Master充當了資源管理的角色,Workder充當了計算節點的角色。在該模式下,Spark Driver程序在客戶端Client運行,而Executor則在Worker節點上運行。工具
Standalone 組件分析 整個集羣分爲Master節點和Worker節點,其中Driver程序運行在客戶端。
.Master節點負責爲任務分配Worker節點上的計算資源,二者會經過相互通訊來同步資源狀態,見途中紅色雙向箭頭。
.客戶端啓動任務後會運行Driver程序,Driver程序中會完成SparkContext對象的初始化,並向Master進行註冊。
.每一個Workder節點上會存在一個或者多個ExecutorBackend進程。每一個進程包含一個Executor對象,該對象持有一個線程池,每一個線程池能夠執行一個任務task。ExecutorBackend進程還負責跟客戶端節點上的Driver程序進行通訊,上報任務狀態。學習
Spark Standalone任務運行過程測試
上面的過程反映了Spark在standalone模式下,總體上客戶端、Master和Workder節點之間的交互。對於一個任務的具體運行過程須要更細緻的分解,分解運行過程見圖中的小字。spa
1.用戶經過bin/spark-submit部署工具或者bin/spark-class啓動應用程序的Driver進程,Driver進程會初始化SparkContext對象,並向Master節點進行註冊。
2.Master節點接受Driver程序的註冊,檢查它所管理的Worker節點,爲該Driver程序分配須要的計算資源Executor。Worker節點完成Executor的分配後,向Master報告Executor的狀態。
3.Worker節點上的ExecutorBackend進程啓動後,向Driver進程註冊。
4.Driver進程內部經過DAG Schaduler,Stage Schaduler,Task Schaduler等過程完成任務的劃分後,向Worker節點上的ExecutorBackend分配TASK。
5.ExecutorBackend進行TASK計算,並向Driver報告TASK狀態,直至結束。
6.Driver進程在全部TASK都處理完成後,向Master註銷。
Spark Standalone 模式總結
Spark可以以standalone模式運行,這是Spark自身提供的運行模式,用戶能夠經過手動啓動master和worker進程來啓動一個獨立的集羣,也能夠在一臺機器上運行這些守護進程進行測試。standalone模式能夠用在生產環境,它有效的下降了用戶學習、測試Spark框架的成本。
standalone模式目前只支持跨應用程序的簡單FIFO調度。然而,爲了容許多個併發用戶,你能夠控制每一個應用使用的資源的最大數。默認狀況下,它會請求使用集羣的所有CPU內核。
缺省狀況下,standalone任務調度容許worker的失敗(在這種狀況下它能夠將失敗的任務轉移給其餘的worker)。可是,調度器使用master來作調度,這會產生一個單點問題:若是master崩潰,新的應用不會被建立。爲了解決這個問題,能夠zookeeper的選舉機制在集羣中啓動多個master,也可使用本地文件實現單節點恢復。
Spark Cluster模式任務運行過程
1.用戶經過bin/spark-submit部署工具或者bin/spark-class向Yarn集羣提交應用程序。
2.Yarn集羣的Resource Manager爲提交的應用程序選擇一個Node Manager節點並分配第一個container,並在該節點的container上啓動SparkContext對象。
3.SparkContext對象向Yarn集羣的Resource Manager申請資源以運行Executor。
.Yarn集羣的Resource Manager分配container給SparkContext對象,SparkContext和相關的Node Manager通信,在得到的container上啓動ExecutorBackend守護進程,ExecutorBackend啓動後開始向SparkContext註冊並申請Task。
5.SparkContext分配Task給ExecutorBackend執行。
6.ExecutorBackend開始執行Task,並及時向SparkContext彙報運行情況。
7.Task運行完畢,SparkContext歸還資源給Node Manager,並註銷退。
Spark Cluster 模式總結
Spark可以以集羣的方式運行,這裏的可選集羣有Yarn和Mesos。在集羣模式下,Spark的Driver程序可能被調度到任何一個節點,任務執行完成後,集羣分配的資源將被回收。