Spark執行原理自我理解:html
(1) 首先程序有RDD Objects分解爲DAG有向無環圖算法
(2) 提交DAGScheduler,依據shuffer將DAG分解爲一組taskset,即stagessql
(3) Taskset提交TaskScheduler,每個taskset在分解爲多個task,即一個task就是一個split分區shell
(4) Task就執行在worker上編程
Spark執行原理緩存
(1)用戶建立SparkContext對象,新建立的SparkContext會依據用戶在編程的時候指定的參數或者系統默認的配置鏈接到ClusterManager。框架
(2)Cluster Manager會依據用戶提交時的設值,(程序佔用CPU的個數,內存的信息等等)來爲咱們詳細的本次的程序分配計算資源。啓動詳細的Executor。機器學習
Driver會依據用戶程序來進行這樣的調度級別的一種Stage劃分,但這邊談的stage的劃分是高層調度器。Saprk在詳細執行時分爲高層調度和底層調度。高層調度是基於RDD的依賴。RDD的產生通常由前面RDD的詳細某個操做中產生。第一次也可以從文件系統中讀取一個內容就本身主動產生,也就是SparkContxt中產生,然後面老是依賴於前面的RDD產生。構成了繼承和依賴關係。分佈式
假設說碰見寬依賴的時候,就劃分紅不一樣的Stage。每個Stage會有一組全然一樣的任務組成。這些任務分別做用待處理數據的不一樣分區。函數
(3)在Stage劃分完畢和Task詳細建立以後。Driver端會向詳細的Executor發送詳細的任務。Executor收到任務就會下載Task執行時依賴的庫,包。準備好Task的
執行環境以後開始執行Task,執行時就是線程池中的線程執行的。
(4)在執行Task的過程當中,會把執行狀態彙報給Driver。Driver會依據收到的Task執行狀態來處理不一樣的狀態更新。Task自己依據咱們以前不一樣的Stage劃分。會把Task分爲兩種類型,一種是ShuffleMapTask,這個是對數據進行Shuffle,Shuffle的結果會保存在Executor所在節點的本地文件系統中。第二種是ResultTask。就是最後一個Stage。負責生成結果數據。Driver會不斷地調用Task。將Task發送到Executor中執行,所有的Task都正確執行,或者超過執行次數的限制沒有成功是會中止。正確執行了就會進入下一個Stage。
高層調度器DAGScheduler會幫助咱們進行必定次數的重試,假設咱們重試必定次數還沒成功,那整個做業失敗。
===================================================================================================================================
spark是一個分佈式。基於內存的適合迭代計算的大數據計算框架。
基於內存,在一些狀況下也會基於磁盤,spark計算時會優先考慮把數據放到內存中,應爲數據在內存中就具備更好的數據本地性;假設內存放不下時,也會將少許數據放到磁盤上,它的計算既可以基於內存也可以基於磁盤,它適於不論什麼規模的數據的計算。
Spark想用一個技術堆棧解決所有的大數據計算問題。大數據計算問題主要包括:交互式查詢(基於shell和sql)、流處理(數據流入後直接進行處理)和批處理(基於Spark內核進行的一個RDD級別的編程,同一時候還包括圖計算、機器學習的內容)。
眼下Spark支持的5中計算範式:流處理、SQL、R、圖計算、機器學期等。
咱們可以從三個方面去理解Spark。
1. 分佈式
在生產環境下,是在分佈式多臺機器下去執行的。它會有幾個特徵:(1)咱們的Spark會有一個Driver端。也就是所謂的client。咱們本身編寫的程序,要提交給集羣;而在集羣中有很是多機器,
整做業的執行其實是執行在分佈式的節點(默認一臺機器是一個節點)中的。
Spark程序提交到Spark集羣上進行執行,執行時要處理一批數據,由於它是分佈式的。因此執行時不一樣的節點會處理一部分數據。
各個部分節點處理數據互不干擾。
因此,在作分佈式時,就可以並行化。因此他就可以處理數據更快。
1. (主要)基於內存
Spark優先考慮使用內存,事實上是是對計算機資源最大化利用的一個物理基石。
在內存中可以放下時,最早考慮到內存中,放不下時放在磁盤上。
2. 擅長迭代式計算
擅長迭代式計算是Spark的真正精髓。在實際假設要對數據進行稍有價值的挖掘或是對數據進行稍有複雜度的一些挖掘。必定是要對數據進行具備多步奏的計算。這時候就要用到迭代式的計算,而Spark天生就是適用於分佈式的主要基於內存的迭代式計算。Spark基於磁盤的迭代式計算會比hadoop快10x倍。而Spark基於內存的迭代式計算要比hadoop快100x倍。這裏要提一下,看成業計算完第一個階段,而後移動還有一個節點中進行計算。也就是所謂爲的shuffle。而且可以重複的shuffle,並造成一個鏈條,這就是迭代。
咱們寫好的本地程序,提交到Driver上,他會提供一個接口即SparkContext,而後Driver會將咱們的程序提交到集羣上,各個work會並行計算處理咱們的程序。Hadoop和Spark最根本的不一樣是迭代模型的不一樣,hadoop主要是兩步map階段和reduce階段,進行完計算以後。就沒有之後的階段了,而Spark可以在計算完第一個階段後,進行第二階段計算。第二階段計算完後進行第三階段…也就是說。咱們進行完一個階段後,後面可以有很是多階段的計算來完畢任務,而不是hadoop僅僅有map和reduce兩個階段這麼僵硬。
由於它的這樣的迭代式模型使得Spark更增強大和靈活。構造複雜算法時也更加easy。
在讀取文件時,hadoop每次都是都是讀取磁盤和寫入磁盤,而Spark是基於內存的,大部分中間計算結果是保存在內存中,下一次計算是基於內存的計算結果的,因此節省了讀取磁盤的時間。
Spark的快速執行除了基於內存。主要緣由仍是由於他的調度器(基於DAG之上的調度器,有高層調度器和底層調度器和容錯)。
咱們在本地開發好Spark文件,詳細在單獨的機器上提交程序,如上圖圓圈中的都是Driver級別的,這些都是驅動整個程序執行的,Spark程序是會提交到集羣中去執行的,他詳細執行時是要靠Driver驅動來執行的。
而詳細節點(如Spark worker)是一各個計算的節點work,而在計算時,要讀取詳細的數據,讀取數據可以從HDFS。HBase,Hive或是傳統的DB來源讀取數據,處理數據時主要是利用線程池、線程複用的方式。處理完畢後,數據可以放在HDFS,HBase,Hive。DB。還可以直接返回直接給client。也就是正在執行程序的機器上的進程。
RDD:彈性分佈式數據起。本生是對分佈式計算一個抽象。
首先它是一個數據集(DataSet)。它會表明咱們要處理的數據。但是它是分佈式的,也就是分紅很是多分片。分佈在幾百臺或上千臺機器上的。
在每個節點上存儲時默認這些數據都是放在內存中的。RDD表明了一些列的分片。而這些分片是在詳細的不一樣節點上存儲,默認優先在內存中存儲。假設內存放不下,他會把一部分放在磁盤上進行存儲。而這些對於咱們用戶來講是透明的。咱們僅僅需要針對RDD進行計算和處理便可了。RDD本生會本身主動進行內存和磁盤的權衡和切換。這就是彈性之中的一個,其次,它基於Lineage的高效容錯(他會更具血統繼承關係來恢復執行出錯狀況,可以從上一個步奏進行又一次計算,而不會從第一個步奏又一次計算。效率很是高,覺得不需要重頭開始又一次計算),第三。task假設失敗,會本身主動進行特定次數的重試(默認4次),第四。Stage假設失敗會本身主動進行特定次數的重試(默認3次,僅僅計算失敗的分片)。
如下咱們講下緩存的時機:
(1)計算特別耗時
(2)計算鏈條已經很是長了
(3)Shuffle以後(衝其它地方抓數據後)
(4)ChechPoint以前(chechPoint是當前做業執行後,再觸發一個做業)
RDD 本生會有一些列的數據分片,一個 RDD 在邏輯上就表明了頂層的一個文件或目錄,但實際上它是依照分區( partition )分爲多個分區。分區會放在 Spark 集羣中不一樣的機器的節點上。而 RDD 本生又包括了對函數的計算。