首頁技術(shù)文章正文

Spark集群的運(yùn)行架構(gòu)和基本原理

更新時(shí)間:2022-03-28 來源:黑馬程序員 瀏覽量:

Spark集群的運(yùn)行架構(gòu)

Python開發(fā)人員經(jīng)常使用Spark進(jìn)行大規(guī)模數(shù)據(jù)處理和分析,Spark是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架,比MapReduce計(jì)算框架具有更高的實(shí)時(shí)性,同時(shí)具有高效容錯(cuò)性和可伸縮性,在學(xué)習(xí)Spark操作之前,首先介紹Spark運(yùn)行架構(gòu),如圖2-11所示。

Spark集群的運(yùn)行架構(gòu)

在上圖中,Spark應(yīng)用在集群上運(yùn)行時(shí),包括了多個(gè)獨(dú)立的進(jìn)程,這些進(jìn)程之間通過驅(qū)動(dòng)程序(Driver Program)中的SparkContext對(duì)象進(jìn)行協(xié)調(diào),SparkContext對(duì)象能夠與多種集群資源管理器(Cluster Manager)通信,一旦與集群資源管理器連接,Spark會(huì)為該應(yīng)用在各個(gè)集群節(jié)點(diǎn)上申請(qǐng)執(zhí)行器(Executor), 用 于 執(zhí) 行 計(jì) 算 任 務(wù) 和 存 儲(chǔ) 數(shù) 據(jù)。Spark將應(yīng)用程序代碼發(fā)送給所申請(qǐng)到的執(zhí)行器,SparkContext對(duì)象將分割出的任務(wù)(Task)發(fā)送給各個(gè)執(zhí)行器去運(yùn)行。

需要注意的是,每個(gè)Spark應(yīng)用程序都有其對(duì)應(yīng)的多個(gè)執(zhí)行器進(jìn)程。執(zhí)行器進(jìn)程在整北京市昌平區(qū)建材城西路金燕龍辦公樓一層電話:400-618-400015個(gè)應(yīng)用程序生命周期內(nèi),都保持運(yùn)行狀態(tài),并以多線程方式執(zhí)行任務(wù)。這樣做的好處是,執(zhí)行器進(jìn)程可以隔離每個(gè)Spark應(yīng)用。從調(diào)度角度來看,每個(gè)驅(qū)動(dòng)器可以獨(dú)立調(diào)度本應(yīng)用程序的內(nèi)部任務(wù)。從執(zhí)行器角度來看,不同Spark應(yīng)用對(duì)應(yīng)的任務(wù)將會(huì)在不同的JVM中運(yùn)行。然而這樣的架構(gòu)也有缺點(diǎn),多個(gè)Spark應(yīng)用程序之間無法共享數(shù)據(jù),除非把數(shù)據(jù)寫到外部存儲(chǔ)結(jié)構(gòu)中。

Spark對(duì)底層的集群管理器一無所知,只要Spark能夠申請(qǐng)到執(zhí)行器進(jìn)程,能與之通信即可。這種實(shí)現(xiàn)方式可以使Spark比較容易的在多種集群管理器上運(yùn)行,例如Mesos、Yarn。

驅(qū)動(dòng)器程序在整個(gè)生命周期內(nèi)必須監(jiān)聽并接受其對(duì)應(yīng)的各個(gè)執(zhí)行器的連接請(qǐng)求,因此驅(qū)動(dòng)器程序必須能夠被所有Worker節(jié)點(diǎn)訪問到。

因?yàn)榧荷系娜蝿?wù)是由驅(qū)動(dòng)器來調(diào)度的,所以驅(qū)動(dòng)器應(yīng)該和Worker節(jié)點(diǎn)距離近一些,最好在同一個(gè)本地局域網(wǎng)中,如果需要遠(yuǎn)程對(duì)集群發(fā)起請(qǐng)求,最好還是在驅(qū)動(dòng)器節(jié)點(diǎn)上啟動(dòng)RPC服務(wù)響應(yīng)這些遠(yuǎn)程請(qǐng)求,同時(shí)把驅(qū)動(dòng)器本身放在離集群Worker節(jié)點(diǎn)比較近的機(jī)器上。

Spark運(yùn)行基本流程

通過上一小節(jié)了解到,Spark運(yùn)行架構(gòu)主要由SparkContext、Cluster Manager和Worker組成,其中Cluster Manager負(fù)責(zé)整個(gè)集群的統(tǒng)一資源管理,Worker節(jié)點(diǎn)中的Executor是應(yīng)用執(zhí)行的主要進(jìn)程,內(nèi)部含有多個(gè)Task線程以及內(nèi)存空間,下面通過圖2-12深入了解Spark運(yùn)行基本流程。圖2-12Spark運(yùn)行基本流程圖

Spark運(yùn)行基本流程

(1)當(dāng)一個(gè)Spark應(yīng)用被提交時(shí),根據(jù)提交參數(shù)在相應(yīng)位置創(chuàng)建Driver進(jìn)程,Driver進(jìn)程根據(jù)配置參數(shù)信息初始化SparkContext對(duì)象,即Spark運(yùn)行環(huán)境,由SparkContext負(fù)責(zé)和Cluster Manager的通信以及資源的申請(qǐng)、任務(wù)的分配和監(jiān)控等。SparkContext啟動(dòng)后,創(chuàng)建DAG Scheduler(將DAG圖分解成Stage)和Task Scheduler(提交和監(jiān)控Task)兩個(gè)調(diào)度模塊。

(2)Driver進(jìn)程根據(jù)配置參數(shù)向Cluster Manager申請(qǐng)資源(主要是用來執(zhí)行的Executor),Cluster Manager接收到應(yīng)用(Application)的注冊(cè)請(qǐng)求后,會(huì)使用自己的資源調(diào)度算法,在Spark集群的Worker節(jié)點(diǎn)上,通知Worker為應(yīng)用啟動(dòng)多個(gè)Executor。

(3)Executor創(chuàng)建后,會(huì)向Cluster Manager進(jìn)行資源及狀態(tài)的反饋,便于Cluster Manager對(duì)Executor進(jìn)行狀態(tài)監(jiān)控,如果監(jiān)控到Executor失敗,則會(huì)立刻重新創(chuàng)建。

(4)Executor會(huì)向SparkContext反向注冊(cè)申請(qǐng)Task。

(5)Task Scheduler將Task發(fā)送給Worker進(jìn)程中的Executor運(yùn)行并提供應(yīng)用程序代碼。

(6)當(dāng)程序執(zhí)行完畢后寫入數(shù)據(jù),Driver向Cluster Manager注銷申請(qǐng)的資源。


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!