更新時間:2022-03-28 來源:黑馬程序員 瀏覽量:
Python開發(fā)人員經(jīng)常使用Spark進行大規(guī)模數(shù)據(jù)處理和分析,Spark是基于內(nèi)存計算的大數(shù)據(jù)并行計算框架,比MapReduce計算框架具有更高的實時性,同時具有高效容錯性和可伸縮性,在學習Spark操作之前,首先介紹Spark運行架構(gòu),如圖2-11所示。
在上圖中,Spark應用在集群上運行時,包括了多個獨立的進程,這些進程之間通過驅(qū)動程序(Driver Program)中的SparkContext對象進行協(xié)調(diào),SparkContext對象能夠與多種集群資源管理器(Cluster Manager)通信,一旦與集群資源管理器連接,Spark會為該應用在各個集群節(jié)點上申請執(zhí)行器(Executor), 用 于 執(zhí) 行 計 算 任 務 和 存 儲 數(shù) 據(jù)。Spark將應用程序代碼發(fā)送給所申請到的執(zhí)行器,SparkContext對象將分割出的任務(Task)發(fā)送給各個執(zhí)行器去運行。
需要注意的是,每個Spark應用程序都有其對應的多個執(zhí)行器進程。執(zhí)行器進程在整北京市昌平區(qū)建材城西路金燕龍辦公樓一層電話:400-618-400015個應用程序生命周期內(nèi),都保持運行狀態(tài),并以多線程方式執(zhí)行任務。這樣做的好處是,執(zhí)行器進程可以隔離每個Spark應用。從調(diào)度角度來看,每個驅(qū)動器可以獨立調(diào)度本應用程序的內(nèi)部任務。從執(zhí)行器角度來看,不同Spark應用對應的任務將會在不同的JVM中運行。然而這樣的架構(gòu)也有缺點,多個Spark應用程序之間無法共享數(shù)據(jù),除非把數(shù)據(jù)寫到外部存儲結(jié)構(gòu)中。
Spark對底層的集群管理器一無所知,只要Spark能夠申請到執(zhí)行器進程,能與之通信即可。這種實現(xiàn)方式可以使Spark比較容易的在多種集群管理器上運行,例如Mesos、Yarn。
驅(qū)動器程序在整個生命周期內(nèi)必須監(jiān)聽并接受其對應的各個執(zhí)行器的連接請求,因此驅(qū)動器程序必須能夠被所有Worker節(jié)點訪問到。
因為集群上的任務是由驅(qū)動器來調(diào)度的,所以驅(qū)動器應該和Worker節(jié)點距離近一些,最好在同一個本地局域網(wǎng)中,如果需要遠程對集群發(fā)起請求,最好還是在驅(qū)動器節(jié)點上啟動RPC服務響應這些遠程請求,同時把驅(qū)動器本身放在離集群Worker節(jié)點比較近的機器上。
通過上一小節(jié)了解到,Spark運行架構(gòu)主要由SparkContext、Cluster Manager和Worker組成,其中Cluster Manager負責整個集群的統(tǒng)一資源管理,Worker節(jié)點中的Executor是應用執(zhí)行的主要進程,內(nèi)部含有多個Task線程以及內(nèi)存空間,下面通過圖2-12深入了解Spark運行基本流程。圖2-12Spark運行基本流程圖
(1)當一個Spark應用被提交時,根據(jù)提交參數(shù)在相應位置創(chuàng)建Driver進程,Driver進程根據(jù)配置參數(shù)信息初始化SparkContext對象,即Spark運行環(huán)境,由SparkContext負責和Cluster Manager的通信以及資源的申請、任務的分配和監(jiān)控等。SparkContext啟動后,創(chuàng)建DAG Scheduler(將DAG圖分解成Stage)和Task Scheduler(提交和監(jiān)控Task)兩個調(diào)度模塊。
(2)Driver進程根據(jù)配置參數(shù)向Cluster Manager申請資源(主要是用來執(zhí)行的Executor),Cluster Manager接收到應用(Application)的注冊請求后,會使用自己的資源調(diào)度算法,在Spark集群的Worker節(jié)點上,通知Worker為應用啟動多個Executor。
(3)Executor創(chuàng)建后,會向Cluster Manager進行資源及狀態(tài)的反饋,便于Cluster Manager對Executor進行狀態(tài)監(jiān)控,如果監(jiān)控到Executor失敗,則會立刻重新創(chuàng)建。
(4)Executor會向SparkContext反向注冊申請Task。
(5)Task Scheduler將Task發(fā)送給Worker進程中的Executor運行并提供應用程序代碼。
(6)當程序執(zhí)行完畢后寫入數(shù)據(jù),Driver向Cluster Manager注銷申請的資源。