理解Spark的運行機制

Spark生態系統目前已經很是成熟了,有不少類型的任務均可以使用spark完成,咱們先看下spark生態系統的組成:java

image

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任務的運行機制以下圖:框架

image

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/

https://www.packtpub.com/mapt/book/big_data_and_business_intelligence/9781785885136/1/ch01lvl1sec11/spark-architecture

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/

相關文章
相關標籤/搜索