Spark-core-架構(gòu)及工作機(jī)制綜述

注:本文參考文獻(xiàn)有書籍《Spark大數(shù)據(jù)處理:技術(shù)、應(yīng)用與性能優(yōu)化》、RDD的Paper《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。從三個部分來解讀Spark-core,首先是Spark的架構(gòu),闡述了Spark基于彈性分布式數(shù)據(jù)集RDD這個計算模型的工作機(jī)制(計算流程):Application->Job->Stage->Task 的分解、分發(fā)和并行計算;接下去從計算模型工作機(jī)制兩個方面,分別解讀RDD的設(shè)計思想及其算子,以及劃分RDD有向無環(huán)圖為Stage和Task、并行計算的工作機(jī)制。進(jìn)一步的原理分析和源碼研讀將在該系列的后續(xù)文章中撰寫。

Spark的架構(gòu)

Spark采用了分布式計算中的Master-Slave模型。Master作為整個集群的控制器,負(fù)責(zé)整個集群的正常運行;Worker是計算節(jié)點,接受主節(jié)點命令以及進(jìn)行狀態(tài)匯報;Executor負(fù)責(zé)任務(wù)(Tast)的調(diào)度和執(zhí)行;Client作為用戶的客戶端負(fù)責(zé)提交應(yīng)用;Driver負(fù)責(zé)控制一個應(yīng)用的執(zhí)行。

Spark架構(gòu)圖:出自《Spark大數(shù)據(jù)處理》

Spark集群啟動時,需要從主節(jié)點和從節(jié)點分別啟動Master進(jìn)程和Worker進(jìn)程,對整個集群進(jìn)行控制。在一個Spark應(yīng)用的執(zhí)行過程中,Driver是應(yīng)用的邏輯執(zhí)行起點,運行Application的main函數(shù)并創(chuàng)建SparkContext,DAGScheduler把對Job中的RDD有向無環(huán)圖根據(jù)依賴關(guān)系劃分為多個Stage,每一個Stage是一個TaskSet, TaskScheduler把Task分發(fā)給Worker中的Executor;Worker啟動Executor,Executor啟動線程池用于執(zhí)行Task。

Spark執(zhí)行有向無環(huán)圖:出自《Spark大數(shù)據(jù)處理》

Spark的計算模型

RDD:彈性分布式數(shù)據(jù)集,是一種內(nèi)存抽象,可以理解為一個大數(shù)組,數(shù)組的元素是RDD的分區(qū)Partition,分布在集群上;在物理數(shù)據(jù)存儲上,RDD的每一個Partition對應(yīng)的就是一個數(shù)據(jù)塊Block,Block可以存儲在內(nèi)存中,當(dāng)內(nèi)存不夠時可以存儲在磁盤上。

RDD邏輯物理結(jié)構(gòu)

Hadoop將Mapreduce計算的結(jié)果寫入磁盤,在機(jī)器學(xué)習(xí)、圖計算、PageRank等迭代計算下,重用中間結(jié)果導(dǎo)致的反復(fù)I/O耗時過長,成為了計算性能的瓶頸。為了提高迭代計算的性能和分布式并行計算下共享數(shù)據(jù)的容錯性,伯克利的設(shè)計者依據(jù)兩個特性而設(shè)計了RDD:
1、數(shù)據(jù)集分區(qū)存儲在節(jié)點的內(nèi)存中,減少迭代過程(如機(jī)器學(xué)習(xí)算法)反復(fù)的I/O操作從而提高性能。
2、數(shù)據(jù)集不可變,并記錄其轉(zhuǎn)換過程,從而實現(xiàn)無共享數(shù)據(jù)讀寫同步問題、以及出錯的可重算性。

Operations:算子

算子是RDD中定義的函數(shù),可以對RDD中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換和操作。如下圖,Spark從外部空間(HDFS)讀取數(shù)據(jù)形成RDD_0,Tranformation算子對數(shù)據(jù)進(jìn)行操作(如fliter)并轉(zhuǎn)化為新的RDD_1、RDD_2,通過Action算子(如collect/count)觸發(fā)Spark提交作業(yè)。
??如上的分析過程可以看出,Tranformation算子并不會觸發(fā)Spark提交作業(yè),直至Action算子才提交作業(yè),這是一個延遲計算的設(shè)計技巧,可以避免內(nèi)存過快被中間計算占滿,從而提高內(nèi)存的利用率。

Spark算子:出自《Spark大數(shù)據(jù)處理》

下圖是算子的列表,分三大類:Value數(shù)據(jù)類型的Tranformation算子;Key-Value數(shù)據(jù)類型的Tranformation算子;Action算子。

RDD的算子:出自伯克利的RDD論文
Lineage Graph:血統(tǒng)關(guān)系圖

下圖的第一階段生成RDD的有向無環(huán)圖,即是血統(tǒng)關(guān)系圖,記錄了RDD的更新過程,當(dāng)這個RDD的部分分區(qū)數(shù)據(jù)丟失時,它可以通過Lineage獲取足夠的信息來重新運算和恢復(fù)丟失的數(shù)據(jù)分區(qū)。DAGScheduler依據(jù)RDD的依賴關(guān)系將有向無環(huán)圖劃分為多個Stage,一個Stage對應(yīng)著一系列的Task,由TashScheduler分發(fā)給Worker計算。

RDD運行變化圖

Spark的工作機(jī)制

本模塊從六個方面,介紹Spark的內(nèi)部運行機(jī)制。

應(yīng)用執(zhí)行機(jī)制

Spark應(yīng)用(Application)是用戶提交的應(yīng)用程序,執(zhí)行模式有Local、Standalone、YARN、Mesos。根據(jù)Application的Driver Program(或者YARN的AppMaster)是否在集群中運行,Spark應(yīng)用的運行方式又可以分為Cluster模式和Client模式。
??Standalone模式
??Driver運行在客戶端

Driver運行在客戶端:出自網(wǎng)絡(luò)

Driver運行在Worker

Driver運行在Worker:出自網(wǎng)絡(luò)
??YARN模式

Spark on YARN架構(gòu):出自《Spark大數(shù)據(jù)處理》
調(diào)度與任務(wù)分配

從Spark整體上看,調(diào)度可以分為4個級別,Application調(diào)度 -> Job調(diào)度 -> Stage調(diào)度 -> Task調(diào)度。


Spark應(yīng)用轉(zhuǎn)換流程:出自《Spark大數(shù)據(jù)處理》
I/O機(jī)制

序列化
??塊管理

通信機(jī)制

Spark在模塊間通信使用的是AKKA框架。AKKA基于Scala開發(fā),用于編寫Actor應(yīng)用。Actors是一些包含狀態(tài)和行為的對象。它們通過顯式傳遞消息來進(jìn)行通信,這些消息會被發(fā)送到它們的收信箱中(消息隊列)。

容錯機(jī)制

Lineage機(jī)制:記錄粗粒度的更新
??Checkpoint機(jī)制:將RDD寫入Disk做檢查點。檢查點的本質(zhì)是作為Lineage做容錯的輔助,lineage過長會造成容錯成本過高。在計算的中間階段做檢查點容錯,如果之后的節(jié)點出現(xiàn)問題而丟失分區(qū),從做檢查點的RDD開始重做Lineage,就可以減少開銷。

Shuffle機(jī)制

當(dāng)單進(jìn)程空間無法容納所有計算數(shù)據(jù)進(jìn)行計算時,通過Shuffle將各個節(jié)點上相同的key拉取到某個節(jié)點上的一個task來進(jìn)行處理,比如按照key進(jìn)行聚合或join等操作。此時如果某個key對應(yīng)的數(shù)據(jù)量特別大的話,就會發(fā)生數(shù)據(jù)傾斜。數(shù)據(jù)傾斜是Spark性能優(yōu)化的一個重大課題。
??可能會觸發(fā)shuffle操作的算子 :distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。
??Shuffle分為兩個階段:Shuffle Write和Shuffle Fetch。如下圖:

Shuffle機(jī)制:出自網(wǎng)絡(luò)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容