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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(4)Executor會向SparkContext反向注冊申請Task。

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

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


分享到:
在線咨詢 我要報名
和我們在線交談!