Spark生態系統目前已經很是成熟了,有不少類型的任務均可以使用spark完成,咱們先看下spark生態系統的組成:java
spark的核心主要由3個模塊組成:node
(1)spark core 是spark的最底層的編程實現,定義了許多的函數及方法,是全部spark組件的基礎依賴sql
(2)spark ecosystems 是spark裏面的一些高級組件,基本就是咱們最經常使用的框架apache
(3)resource management 負責spark任務的調度編程
平時咱們開發過程當中,基本上使用的都是第二層裏面的一些框架,這裏面使用最多的莫過於spark sql和spark streaming了。在對spark整個生態系統有一個基本瞭解後,下面咱們就關注的是其運行機制了,只有解了運行機制,纔會對咱們使用程序,或者排查問題以及性能調優起到很大的幫助。session
下面咱們看下spark任務的運行機制以下圖:框架
Spark相關一些術語解釋:分佈式
(一)Driver program函數
driver就是咱們編寫的spark應用程序,用來建立sparkcontext或者sparksession,driver會和cluster mananer通訊,並分配task到executor上執行性能
(二)Cluster Manager
負責整個程序的資源調度,目前的主要調度器有:
YARN
Spark Standalone
Mesos
(三)Executors
Executors實際上是一個獨立的JVM進程,在每一個工做節點上會起一個,主要用來執行task,一個executor內,能夠同時並行的執行多個task。
(四)Job
Job是用戶程序一個完整的處理流程,是邏輯的叫法。
(五)Stage
一個Job能夠包含多個Stage,Stage之間是串行的,State的觸發是由一些shuffle,reduceBy,save動做產生的
(六)Task
一個Stage能夠包含多個task,好比sc.textFile("/xxxx").map().filter(),其中map和filter就分別是一個task。每一個task的輸出就是下一個task的輸出。
(七)Partition
partition是spark裏面數據源的一部分,一個完整的數據源會被spark切分紅多個partition以方便spark能夠發送到多個executor上去並行執行任務。
(八)RDD
RDD是分佈式彈性數據集,在spark裏面一個數據源就能夠當作是一個大的RDD,RDD由多個partition組成,spark加載的數據就會被存在RDD裏面,固然在RDD內部實際上是切成多個partition了。
那麼問題來了一個spark job是如何執行的?
(1)咱們寫好的spark程序,也稱驅動程序,會向Cluster Manager提交一個job
(2)Cluster Manager會檢查數據本地行並尋找一個最合適的節點來調度任務
(3)job會被拆分紅不一樣stage,每一個stage又會被拆分紅多個task
(4)驅動程序發送task到executor上執行任務
(5)驅動程序會跟蹤每一個task的執行狀況,並更新到master node節點上,這一點咱們能夠在spark master UI上進行查看
(6)job完成,全部節點的數據會被最終再次聚合到master節點上,包含了平均耗時,最大耗時,中位數等等指標。
最後關於spark的並行執行策略在總結下:
首先咱們的數據源會被加載到RDD裏面,在RDD裏面整個數據源會被切分紅多個partition,partition的個數實際就是咱們執行任務的最大並行度,每一個task會負責一個partition的數據,而每一個spark任務最大能夠執行task的個數=executor的個數 * 每一個executor的cores的個數。對應到submit腳本中參數就是:
--num-executors --executor-cores
根據spark官網的建議每一個executor上建議分配置的core的個數應該在3到5之間,若是分配的太多會生成大量的小task執行,task的序列化和傳輸都會比較耗性能,若是分配的task數量太少,那麼咱們的executor大部分時候機器資源就會浪費,因此分配的個數通常在3到5個就行,這一點須要注意。
附錄:
Spark中RDD,DataFrame,DataSet的區別:
一、RDD支持面向java、scala對象,編譯時強類型檢查。缺點,序列化很是消耗時間(集羣分發和磁盤存儲),不能充分利用系統的高級優化能力(如off-heap),垃圾回收對象開銷大。
二、DataFrame支持數據集的模式表示(即數據列的概念),因此集羣分發數據時並不須要序列化,能充分利用系統高級優化能力(off-heap),引入查詢計劃提升性能。缺點,DataFrame的列類型,在編譯時沒法判斷類型,會產生運行時錯誤。
三、Dataset即支持數據集的模式表示,又支持java、scala對象的類型檢查能力。二者經過引入一種編碼、解碼機制來實現。
參考連接:
http://datastrophic.io/core-concepts-architecture-and-internals-of-apache-spark/
http://backtobazics.com/big-data/spark/understanding-apache-spark-architecture/
https://www.dezyre.com/article/how-data-partitioning-in-spark-helps-achieve-more-parallelism/297
http://www.agildata.com/apache-spark-rdd-vs-dataframe-vs-dataset/