題記
spark的運行原理對於spark的學習尤其重要,若是不瞭解其運行原理,也就不會從根本上將spark的程序寫好。這將是寫的最後一篇關於spark理論的文章。接下來將從實踐方面來分享sparknode
- Cluster Manager:在standalone模式中即爲Master主節點,控制整個集羣,監控worker。在YARN模式中爲ResourceManager
- Worker節點:從節點,負責控制計算節點,啓動Executor或者Driver。
- Driver: 運行Application 的main()函數
- Executor:執行器,是爲某個Application運行在worker node上的一個進程,Executor中有線程池
- spark任務運行流程圖以下:
- 構建Spark Application的運行環境,啓動SparkContext
- SparkContext向資源管理器(能夠是Standalone,Mesos,Yarn)申請運行Executor資源,並啓動StandaloneExecutorbackend,
- Executor向SparkContext申請Task
- SparkContext將應用程序分發給Executor
- SparkContext構建成DAG圖,將DAG圖分解成Stage、將Taskset發送給Task Scheduler,最後由Task Scheduler將Task發送給Executor運行
- Task在Executor上運行,運行完釋放全部資源
Spark運行特色:
- 每一個Application獲取專屬的executor進程,該進程在Application期間一直駐留,並以多線程方式運行Task。這種Application隔離機制是有優點的,不管是從調度角度看(每一個Driver調度他本身的任務),仍是從運行角度看(來自不一樣Application的Task運行在不一樣JVM中),固然這樣意味着Spark Application不能跨應用程序共享數據,除非將數據寫入外部存儲系統
- Spark與資源管理器無關,只要可以獲取executor進程,並能保持相互通訊就能夠了
- 提交SparkContext的Client應該靠近Worker節點(運行Executor的節點),最好是在同一個Rack裏,由於Spark Application運行過程當中SparkContext和Executor之間有大量的信息交換
- Task採用了數據本地性和推測執行的優化機制
經常使用術語:web
- TASKSedulter: 將TaskSET提交給worker運行,每一個Executor運行什麼Task就是在此處分配的. TaskScheduler維護全部TaskSet,當Executor向Driver發生心跳時,TaskScheduler會根據資源剩餘狀況分配相應的Task。另外TaskScheduler還維護着全部Task的運行標籤,重試失敗的Task。下圖展現了TaskScheduler的做用
-
在不一樣運行模式中任務調度器具體爲:多線程
- Spark on Standalone模式爲TaskScheduler
- YARN-Client模式爲YarnClientClusterScheduler
- YARN-Cluster模式爲YarnClusterScheduler
- 將這些術語串起來的運行層次圖以下:
- Job=多個stage,Stage=多個同種task, Task分爲ShuffleMapTask和ResultTask,Dependency分爲ShuffleDependency和NarrowDependency
Spark運行模式:架構
- Spark的運行模式多種多樣,靈活多變,部署在單機上時,既能夠用本地模式運行,也能夠用僞分佈模式運行,而當以分佈式集羣的方式部署時,也有衆多的運行模式可供選擇,這取決於集羣的實際狀況,底層的資源調度便可以依賴外部資源調度框架,也可使用Spark內建的Standalone模式。
- 對於外部資源調度框架的支持,目前的實現包括相對穩定的Mesos模式,以及hadoop YARN模式
- 本地模式:經常使用於本地開發測試,本地還分別 local 和 local cluster
standalone: 獨立集羣運行模式框架
- Standalone模式使用Spark自帶的資源調度框架
- 採用Master/Slaves的典型架構,選用ZooKeeper來實現Master的HA
- 框架結構圖以下:
該模式主要的節點有Client節點、Master節點和Worker節點。其中Driver既能夠運行在Master節點上中,也能夠運行在本地Client端。當用spark-shell交互式工具提交Spark的Job時,Driver在Master節點上運行;當使用spark-submit工具提交Job或者在Eclips、IDEA等開發平臺上使用」new SparkConf.setManager(「spark://master:7077」)」方式運行Spark任務時,Driver是運行在本地Client端上的分佈式
Yarn模式運行:函數
- Spark on YARN模式根據Driver在集羣中的位置分爲兩種模式:一種是YARN-Client模式,另外一種是YARN-Cluster(或稱爲YARN-Standalone模式)
- Yarn-Client模式中,Driver在客戶端本地運行,這種模式可使得Spark Application和客戶端進行交互,由於Driver在客戶端,因此能夠經過webUI訪問Driver的狀態,默認是http://hadoop1:4040訪問,而YARN經過http:// hadoop1:8088訪問
YARN-client的工做流程步驟爲:
工具
Spark Client 和 Spark Cluster的區別:
- 理解YARN-Client和YARN-Cluster深層次的區別以前先清楚一個概念:Application Master。在YARN中,每一個Application實例都有一個ApplicationMaster進程,它是Application啓動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源以後告訴NodeManager爲其啓動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別
- YARN-Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督做業的運行情況。當用戶提交了做業以後,就能夠關掉Client,做業會繼續在YARN上運行,於是YARN-Cluster模式不適合運行交互類型的做業
- YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通訊來調度他們工做,也就是說Client不能離開