Spark運(yùn)行架構(gòu)
術(shù)語定義
Client:客戶端進(jìn)程序宦,負(fù)責(zé)提交作業(yè)到Master。
Master:Standalone模式中主控節(jié)點(diǎn)背苦,負(fù)責(zé)接收Client提交的作業(yè)互捌,管理Worker,并命令Worker啟動(dòng)Driver和Executor行剂。
Application:Spark Application的概念和Hadoop MapReduce中的類似秕噪,指的是用戶編寫的Spark應(yīng)用程序,包含了一個(gè)Driver功能的代碼和分布在集群中多個(gè)節(jié)點(diǎn)上運(yùn)行的Executor代碼厚宰;
Driver:Spark中的Driver即運(yùn)行上述Application的main()函數(shù)并且創(chuàng)建SparkContext腌巾,其中創(chuàng)建SparkContext的目的是為了準(zhǔn)備Spark應(yīng)用程序的運(yùn)行環(huán)境遂填。在Spark中由SparkContext負(fù)責(zé)和ClusterManager通信,進(jìn)行資源的申請(qǐng)澈蝙、任務(wù)的分配和監(jiān)控等吓坚;當(dāng)Executor部分運(yùn)行完畢后,Driver負(fù)責(zé)將SparkContext關(guān)閉灯荧。通常用SparkContext代表Drive礁击;
Executor:Application運(yùn)行在Worker 節(jié)點(diǎn)上的一個(gè)進(jìn)程,該進(jìn)程負(fù)責(zé)運(yùn)行Task逗载,并且負(fù)責(zé)將數(shù)據(jù)存在內(nèi)存或者磁盤上哆窿,每個(gè)Application都有各自獨(dú)立的一批Executor。在Spark on Yarn模式下厉斟,其進(jìn)程名稱為CoarseGrainedExecutorBackend挚躯,類似于Hadoop MapReduce中的YarnChild。一個(gè)CoarseGrainedExecutorBackend進(jìn)程有且僅有一個(gè)executor對(duì)象擦秽,它負(fù)責(zé)將Task包裝成taskRunner码荔,并從線程池中抽取出一個(gè)空閑線程運(yùn)行Task。每個(gè)CoarseGrainedExecutorBackend能并行運(yùn)行Task的數(shù)量就取決于分配給它的CPU的個(gè)數(shù)了号涯;
Cluster Manager:指的是在集群上獲取資源的外部服務(wù)目胡,目前有:
- Standalone:Spark原生的資源管理,由Master負(fù)責(zé)資源的分配链快;
- Hadoop Yarn:由YARN中的ResourceManager負(fù)責(zé)資源的分配誉己;
Worker:集群中任何可以運(yùn)行Application代碼的節(jié)點(diǎn),類似于YARN中的NodeManager節(jié)點(diǎn)域蜗。在Standalone模式中指的就是通過Slave文件配置的Worker節(jié)點(diǎn)巨双,在Spark on Yarn模式中指的就是NodeManager節(jié)點(diǎn);
作業(yè)(Job):包含多個(gè)Task組成的并行計(jì)算霉祸,往往由Spark Action催生筑累,一個(gè)JOB包含多個(gè)RDD及作用于相應(yīng)RDD上的各種Operation;
階段(Stage):每個(gè)Job會(huì)被拆分很多組Task丝蹭,每組任務(wù)被稱為Stage慢宗,也可稱TaskSet,一個(gè)作業(yè)分為多個(gè)階段奔穿;
任務(wù)(Task): 被送到某個(gè)Executor上的工作任務(wù)镜沽;
DAGScheduler: 實(shí)現(xiàn)將Spark作業(yè)分解成一到多個(gè)Stage,每個(gè)Stage根據(jù)RDD的Partition個(gè)數(shù)決定Task的個(gè)數(shù)贱田,然后生成相應(yīng)的Task set放到TaskScheduler中缅茉。
TaskScheduler:實(shí)現(xiàn)Task分配到Executor上執(zhí)行。
SparkContext:整個(gè)應(yīng)用的上下文男摧,控制應(yīng)用的生命周期蔬墩。
RDD:Spark的基本計(jì)算單元译打,一組RDD可形成執(zhí)行的有向無環(huán)圖RDD Graph。
SparkEnv:線程級(jí)別的上下文拇颅,存儲(chǔ)運(yùn)行時(shí)的重要組件的引用奏司。
SparkEnv內(nèi)創(chuàng)建并包含如下一些重要組件的引用:
- MapOutPutTracker**:負(fù)責(zé)Shuffle元信息的存儲(chǔ)。
- BroadcastManager**:負(fù)責(zé)廣播變量的控制與元信息的存儲(chǔ)蔬蕊。
- BlockManager**:負(fù)責(zé)存儲(chǔ)管理结澄、創(chuàng)建和查找塊。
- MetricsSystem**:監(jiān)控運(yùn)行時(shí)性能指標(biāo)信息岸夯。
- SparkConf**:負(fù)責(zé)存儲(chǔ)配置信息。
Spark架構(gòu)
Spark架構(gòu)采用了分布式計(jì)算中的Master-Slave模型们妥。Master是對(duì)應(yīng)集群中的含有Master進(jìn)程的節(jié)點(diǎn)猜扮,Slave是集群中含有Worker進(jìn)程的節(jié)點(diǎn)。Master作為整個(gè)集群的控制器监婶,負(fù)責(zé)整個(gè)集群的正常運(yùn)行旅赢;Worker相當(dāng)于是計(jì)算節(jié)點(diǎn),接收主節(jié)點(diǎn)命令與進(jìn)行狀態(tài)匯報(bào)惑惶;Executor負(fù)責(zé)任務(wù)的執(zhí)行煮盼;Client作為用戶的客戶端負(fù)責(zé)提交應(yīng)用,Driver負(fù)責(zé)控制一個(gè)應(yīng)用的執(zhí)行带污。
Spark集群部署后僵控,需要在主節(jié)點(diǎn)和從節(jié)點(diǎn)分別啟動(dòng)Master進(jìn)程和Worker進(jìn)程,對(duì)整個(gè)集群進(jìn)行控制鱼冀。在一個(gè)Spark應(yīng)用的執(zhí)行過程中报破,Driver和Worker是兩個(gè)重要角色。Driver 程序是應(yīng)用邏輯執(zhí)行的起點(diǎn)千绪,負(fù)責(zé)作業(yè)的調(diào)度充易,即Task任務(wù)的分發(fā),而多個(gè)Worker用來管理計(jì)算節(jié)點(diǎn)和創(chuàng)建Executor并行處理任務(wù)荸型。在執(zhí)行階段盹靴,Driver會(huì)將Task和Task所依賴的file和jar序列化后傳遞給對(duì)應(yīng)的Worker機(jī)器,同時(shí)Executor對(duì)相應(yīng)數(shù)據(jù)分區(qū)的任務(wù)進(jìn)行處理瑞妇。
Spark的整體流程為:Client 提交應(yīng)用稿静,Master找到一個(gè)Worker啟動(dòng)Driver,Driver向Master或者資源管理器申請(qǐng)資源踪宠,之后將應(yīng)用轉(zhuǎn)化為RDD Graph自赔,再由DAGScheduler將RDD Graph轉(zhuǎn)化為Stage的有向無環(huán)圖提交給TaskScheduler,由TaskScheduler提交任務(wù)給Executor執(zhí)行柳琢。在任務(wù)執(zhí)行的過程中绍妨,其他組件協(xié)同工作润脸,確保整個(gè)應(yīng)用順利執(zhí)行。
- 在集群啟動(dòng)的時(shí)候他去,各個(gè)slave節(jié)點(diǎn)(也可以說是worker)會(huì)向集群的Master注冊(cè)毙驯,告訴Master我隨時(shí)可以干活了,隨叫隨到
- Master會(huì)根據(jù)一種心跳機(jī)制來實(shí)時(shí)監(jiān)察集群中各個(gè)worker的狀態(tài)灾测,是否能正常工作
- Driver Application提交作業(yè)的時(shí)候也會(huì)先向Master注冊(cè)信息
- 作業(yè)注冊(cè)完畢之后爆价,Master會(huì)向worker發(fā)射Executor命令
- worker產(chǎn)生若干個(gè)Executor準(zhǔn)備執(zhí)行
- 各個(gè)worker中的Executor會(huì)向Driver Application注冊(cè)Executor信息,以便Driver Application能夠?qū)⒆鳂I(yè)分發(fā)到具體的Executor
- Executor會(huì)定期向Driver Application報(bào)告當(dāng)前的狀態(tài)更新信息
- Driver Application發(fā)射任務(wù)到Executor執(zhí)行