Spark原理總結

2021-08-04 14:26:20 字數 3358 閱讀 8626

spark是uc berkeley amp lab所開源的類hadoop mapreduce的通用分布式平行計算框架。spark擁有hadoop mapreduce所具有的優點,但和mapreduce 的最大不同之處在於spark是

基於記憶體的迭代式計算

——spark的job處理的中間輸出結果可以儲存在記憶體中,從而不再需要讀寫hdfs

,除此之外,乙個mapreduce 在計算過程中只有map 和reduce 兩個階段,處理之後就結束了,而在spark的計算模型中,可以分為n階段,因為它記憶體迭代式的,我們在處理完乙個階段以後,可以繼續往下處理很多個階段,而不只是兩個階段。 

因此spark能更好地適用於資料探勘與

機器學習

等需要迭代的mapreduce的

演算法。其不僅實現了mapreduce的運算元map 函式和reduce函式及計算模型,還提供更為豐富的運算元,如filter、join、groupbykey等。是乙個用來實現快速而同用的集群計算的平台。 

spark 框架如圖1 所示 :

從圖1中可以看到,所有的spark應用程式都離不開sparkcontext和executor兩部分,executor負責執行任務,執行executor的機器稱為worker節點,sparkcontext由使用者程式啟動,通過資源排程模組和executor通訊。sparkcontext和executor這兩部分的核心**實現在各種執行模式中都是公用的,在它們之上,根據執行部署模式的不同,包裝了不同排程模組以及相關的適配**。 

具體來說,以

sparkcontext為程式執行的總入口

,在sparkcontext的初始化過程中,spark會分別

建立dagscheduler作業排程

taskscheduler任務調

度兩級排程模組。其中作業排程模組是基於任務階段的高層排程模組,它為每個spark作業計算具有依賴關係的多個排程階段(通常根據shuffle來劃分),然後為每個階段構建出一組具體的任務(通常會考慮資料的本地性等),然後以tasksets(任務組)的形式提交給任務排程模組來具體執行。而任務排程模組則負責具體啟動任務、監控和匯報任務運**況。 

備註:在上述框架圖中的一些術語解釋如下:

cluster manager:在集群上獲取資源的外部服務。目前有三種型別: 

1. standalone, spark原生的資源管理;   

2. apache mesos, 和hadoop mapreduce相容性良好的資源排程框架;  

stage:每個job的task被拆分成很多組task, 作為乙個taskset,命名為stage。stage的排程和劃分由dagscheduler負責。stage又分為shuffle map stage和result stage兩種。stage的邊界就在發生shuffle的地方。 

**rdd:**spark的基本資料操作抽象,可以通過一系列運算元進行操作。

rdd是spark最核心的東西,可以被分割槽、被序列化、不可變、有容錯機制,並且能並行操作的資料集合。儲存級別可以是記憶體,也可以是磁碟。

dagscheduler:根據job構建基於stage的dag(有向無環任務圖),並提交stage給taskscheduler 

taskscheduler:將stage提交給worker(集群)執行,每個executor執行什麼在此分配。 

寬依賴:或稱為shuffledependency, 寬依賴需要計算好所有父rdd對應分割槽的資料,然後在節點之間進行shuffle。 

窄依賴:或稱為narrowdependency,指某個rdd,其分割槽partition x最多被其子rdd的乙個分割槽partion y依賴。窄依賴都是map任務,不需要發生shuffle。因此,窄依賴的task一般都會被合成在一起,構成乙個stage。

spark 的工作原理圖 如圖2 所示

根據圖2 可以把spark的工作流程描述如下:

b. sparkcontext在初始化過程中分別建立

dagscheduler

作業排程和

taskscheduler

任務排程 

兩級排程模組

c. sparkcontext向資源管理器(可以是standalone、mesos、yarn)申請執行executor資源;

d. 由資源管理器分配資源並啟動standaloneexecutorbackend,executor,之後向sparkcontext申請task;

e. dagscheduler將job 劃分為多個stage,並將stage提交給taskscheduler;

g. task在executor上執行,執行完畢釋放所有資源。

詳解: 

在我們的實際開發中需要我們處理的核心程式設計如下: 

1、初始定義的rdd,即你要定義的rdd來自於**,比如是hdfs,還是linux系統中的本地檔案或者是集合 

2、定義對rdd 的計算操作,在spark 中通常稱為

運算元。比如:map 、groupbykey 、reduce 等 

3、對步驟2中產生的新rdd 進行迴圈往復定義其它的運算元操作 

4、將最終獲得的資料集儲存起來。比如儲存在

資料庫或者hdfs上

1、rdd的定義 

rdd(resilient distributed datasets) 彈性分布式資料集。 其詳細描述如下: 

a、rdd在抽象上來說是一種元素集合,包含了資料。它是被分割槽的,分為多個分割槽,每個分割槽分布在集群中的不同節點上,從而讓rdd中的資料可以被並行操作。(分布式資料集)

b、rdd的資料預設情況下存放在記憶體中的,但是在記憶體資源不足時,spark會自動將rdd資料寫入磁碟。比如每個節點最多放5萬資料,結果你每個partition是10萬資料。那麼就會把partition中的部分資料寫入磁碟上,進行儲存。(彈性)

2、rdd操作特性

rdd將操作分為兩類:transformation與action。無論執行了多少次transformation操作,rdd都不會真正執行運算,只有當action操作被執行時,運算才會觸發。而在rdd的內部實現機制中,底層介面則是基於迭代器的,從而使得資料訪問變得更高效,也避免了大量中間結果對記憶體的消耗。 

3、rdd的容錯特性 

rdd最重要的特性就是,提供了容錯性,可以自動從節點失敗中恢復過來。即如果某個節點上的rdd partition,因為節點故障,導致資料丟了,那麼rdd會自動通過自己的資料**重新計算該partition。這一切對使用者是透明的。

spark 執行原理

sparkcontext 乙個執行緒只有乙個 spark的job都是jvm的程序 在spark 2.0之前,sparkcontext是所有spark任務的入口,無論spark集群有多少個節點做並行處理,每個程式只可以有唯一的sparkcontext,它可以被sparkconf物件初始化 spark ...

Spark執行原理

1 建立sparkcontext物件,然後sparkcontext會向clutser manager 集群資源管理器 例如yarn standalone mesos等申請資源 2 資源管理器在worker節點上建立executor並分配資源 cpu 記憶體等 後期excutor會定時向資源管理器傳送...

Spark架構原理

本文總結了spark架構原理,其中主要包括五個元件 driver master worker executor和task,簡要概括了每個元件是幹啥的,並總結提交spark程式之後,這五個元件執行的詳細步驟。為了直觀,就把流程圖放在最前面了 driver是乙個程序,我們編寫的spark程式執行在dri...