Spark是什么
Spark是基于HDFS等分布式存儲(chǔ)之上的數(shù)據(jù)處理分析框架,它擅長(zhǎng)批量數(shù)據(jù)處理肢簿,處理流工作負(fù)載靶剑,交互式查詢,機(jī)器學(xué)習(xí)等池充;它可以通過standalone模式桩引,yarn-client或者yarn-cluster等模式在hadoop集群中運(yùn)行;而依托在spark數(shù)據(jù)處理之上的有Spark Sql,Spark Stream,MLlib,Graphx等組件收夸;
其具體架構(gòu)示意圖如下:
上圖中最上層最組件說明如下:
- Spark Sql:通過提供Apache Hive的sql查詢語句變體HiveQL來與Spark進(jìn)行交互的API庫坑匠,每個(gè)數(shù)據(jù)庫表都是一個(gè)RDD對(duì)象,Spark sql查詢都將轉(zhuǎn)化為Spark的操作卧惜;
- Spark Streaming:能夠提供實(shí)時(shí)數(shù)據(jù)流的處理和控制厘灼,Spark Streaming允許程序像處理普通RDD對(duì)象那樣處理實(shí)時(shí)數(shù)據(jù)流;
- MLlib(Machine Learning):機(jī)器學(xué)習(xí)的一些算法庫咽瓷,算法通過Spark 對(duì)RDD的操作處理來實(shí)現(xiàn)设凹,該庫包括可擴(kuò)展的學(xué)習(xí)算法,如回歸茅姜,分類等需要對(duì)大數(shù)據(jù)集進(jìn)行迭代的算法闪朱;
- GraphX:控制圖和并行圖操作和計(jì)算的算法和工具的集合;
接下來說下Spark架構(gòu),Spark架構(gòu)組成圖如下:
如上圖奋姿,在Spark架構(gòu)中有以下幾個(gè)組成:
- Driver Pragram:Application的driver程序锄开,用來運(yùn)行Application的main函數(shù)以及創(chuàng)建SparkContext進(jìn)程來準(zhǔn)備Application的運(yùn)行環(huán)境;
- SparkContext:SparkContext在Spark中用來和ClusterManager進(jìn)行通信胀蛮,申請(qǐng)資源院刁,分配和監(jiān)控任務(wù)糯钙;
- ClusterManager:負(fù)責(zé)集群資源的管理和分配的節(jié)點(diǎn)粪狼,它會(huì)通過心跳的方式來監(jiān)控workerNode,在Standalone模式中,它就是Master任岸,在Yarn模式中再榄,它就是Resource Manager;
- WorkNode:集群中的從節(jié)點(diǎn),用來負(fù)責(zé)計(jì)算和控制的節(jié)點(diǎn)享潜,可以啟動(dòng)Exector或者Driver困鸥;
- Executor:Application的Executor程序,ClusterManager會(huì)為Application的每個(gè)Executor分配一個(gè)進(jìn)程剑按,采用線程池分配的方式來執(zhí)行TaskSet;
- Task:Executor上執(zhí)行任務(wù)的基本單位疾就;多個(gè)Task可以構(gòu)成一個(gè)Stage;
Spark怎么運(yùn)行
Spark運(yùn)行流程圖如下:
流程講解如下:
- Application程序啟動(dòng)Driver程序艺蝴,創(chuàng)建SparkContext;
- 2.SparkContext向資源管理器申請(qǐng)運(yùn)行Executor節(jié)點(diǎn)資源猬腰,Executor節(jié)點(diǎn)啟動(dòng)SatandaloneExectuorBackend,Exectuor會(huì)定期向資源管理器上報(bào)資源使用情況;
- Executor節(jié)點(diǎn)向SparkContext申請(qǐng)Task,然后SparkContext將Application中的Executor程序發(fā)送給Executor猜敢;
- 4.SparkContext會(huì)將RDD objects構(gòu)建成DAG(有向無環(huán)圖)姑荷,然后發(fā)送給DAG Scheduler;
- DAG Scheduler會(huì)將DAT拆分為多個(gè)Stage缩擂,每個(gè)Stage都是由多個(gè)Task組成鼠冕;然后將TaskSet發(fā)送給TaskScheduler;
- TaskScheduler會(huì)將TaskSet中的Task提交給Exectutor運(yùn)行胯盯,Executor將采用線程池的方式運(yùn)行這些Tasks;Executor會(huì)在Tasks運(yùn)行完成后會(huì)釋放所有資源懈费;
流程術(shù)語如下:
Application:用戶編寫的Spark應(yīng)用程序,包括一個(gè)Driver程序和多個(gè)Executor程序;
Driver:Driver是運(yùn)行Driver程序的一個(gè)節(jié)點(diǎn)博脑,它會(huì)運(yùn)行Application的main函數(shù)憎乙,創(chuàng)建SparkContext,SparkContext用來準(zhǔn)備Application的運(yùn)行環(huán)境趋厉,它可以和ResourceManager通信寨闹,申請(qǐng)資源,分配和監(jiān)控任務(wù)君账;當(dāng)Executor執(zhí)行完最后的任務(wù)時(shí)繁堡,Driver同時(shí)負(fù)責(zé)將SparkContext關(guān)閉,一般情況下Diver可以理解為SparkContext;
Executor: Executor是運(yùn)行Application中Executor程序的一個(gè)進(jìn)程,該進(jìn)程會(huì)和SparkContext保持通信椭蹄,并負(fù)責(zé)某些Task的處理闻牡,然后將數(shù)據(jù)保存到內(nèi)存或者磁盤只盹;在Spark on Yarn模式中宰啦,該進(jìn)程名為CoarseGrainedExecutor Backend,CoarseGrainedExecutorBackend只有一個(gè)Executor對(duì)象棉磨,通過將task包裝秤TaskRunner,然后交給線程池中某個(gè)線程來執(zhí)行艘刚,這樣Executor能并行執(zhí)行的task數(shù)就與分配給它的cpu數(shù)有關(guān)园细;
Worker:在Spark集群中能夠運(yùn)行Application程序的節(jié)點(diǎn)奈搜,Standalone模式下是通過slave文件配置的節(jié)點(diǎn)接癌;而在Yarn模式下則指的是NodeManager;
-
ClusterManager: 集群資源管理本讥,負(fù)責(zé)集群資源的管理和監(jiān)控应媚,在不同運(yùn)行模式下有不同的類型:
- Standalone模式:Spark原生的資源管理器严沥,由Master來負(fù)責(zé)資源的管理和分配;
- Apache Mesos模式下:Apache Mesos是一種與Hadoop結(jié)合很好的資源調(diào)度框架;
- Yarn模式:指的是ResourceManager;
job:是包含多個(gè)task的并行計(jì)算中姜,由Spark Action觸發(fā)消玄,一個(gè)Application會(huì)產(chǎn)生多個(gè)job;
task: 是由Executor負(fù)責(zé)執(zhí)行的工作單元丢胚,和HadoopMR中的MapTask和ReduceTask概念一致翩瓜,由TaskScheduler負(fù)責(zé)調(diào)度和分配,多個(gè)task可以組成一個(gè)stage;
stage:每個(gè)job都可以劃分成多組Task携龟,作為一個(gè)taskSet兔跌,叫做stage;stage由DAGScheduler進(jìn)行拆分和調(diào)度,拆分的依據(jù)是根據(jù)RDD Object之間的依賴關(guān)系找出開銷最小的方法骨宠;stage分為非最終stage(shuffle Map stage)和最終stage(Result stage),這兩種stage的邊界就是發(fā)生shuffle的地方浮定;
DAGScheduler:DAGScheduler是Driver中根據(jù)job構(gòu)建成stage的調(diào)度器,然后將構(gòu)建后的stage交給TaskScheduler层亿;
-
TaskScheduler:TaskScheduler是Driver中用來向Executor分配Task和維護(hù)所有taskset的調(diào)度器桦卒,當(dāng)Executor向Driver發(fā)送心跳時(shí),TaskScheduler會(huì)根據(jù)資源剩余情況向Executor分配的任務(wù)匿又;同時(shí)TaskScheduler還維護(hù)每個(gè)TaskSet的運(yùn)行標(biāo)簽方灾,包括失敗和重試的次數(shù);在不同模式下TaskScheduler名稱不一樣:
- Spark on Standalone:名稱為TaskScheduler;
- yarn-client模式下為: YarnClientClusterScheduler;
- yarn-cluster模式下為:YarnClusterScheduler;
將流程術(shù)語串起來就得到了Spark 運(yùn)行層次圖如下:
一個(gè)spark可以有多個(gè)stage碌更,每個(gè)stage由同種task構(gòu)成裕偿,task可以分為shuffleMapTask和ResultTask,其中
Dependency也分為ShuffleDependency和NarrowDependency;
Spark運(yùn)行模式有哪些
Spark運(yùn)行模式比較豐富,運(yùn)行在單機(jī)上可以有:本地模式和偽分布式模式痛单;運(yùn)行在分布式環(huán)境下嘿棘,根據(jù)結(jié)合的資源調(diào)度框架又有不同的劃分,本文就介紹:Spark內(nèi)建的Standalone模式和Yarn-client模式和Yarn-cluster模式
Standalone模式(獨(dú)立模式)
Standalone模式是Spark內(nèi)建的一種資源調(diào)度框架旭绒,它采用Master/Slave模式鸟妙,通過zookeeper來保證Master的高可用焦人,其框架圖如下:(參考https://www.cnblogs.com/cxxjohnson/p/8909578.html)
該模式中有Master節(jié)點(diǎn),slave節(jié)點(diǎn)重父,worker節(jié)點(diǎn)花椭,其中Driver既可以運(yùn)行在Master節(jié)點(diǎn)上也可以運(yùn)行在本地客戶端,如果通過spark-shell提交job房午,則Diver運(yùn)行在master節(jié)點(diǎn)上矿辽,如果通過spark-submit提交job或者在Eclips、IDEA等開發(fā)平臺(tái)上使用”new SparkConf.setManager(“spark://master:7077”)”方式運(yùn)行Spark任務(wù)時(shí)郭厌,Driver是運(yùn)行在本地Client端上的袋倔;
具體運(yùn)行過程如下:
運(yùn)行說明如下:
- Client運(yùn)行Application的Driver,創(chuàng)建SparkContext沪曙,SparkContext會(huì)注冊(cè)到Master上奕污,并向Master申請(qǐng)cpu萎羔,memory資源液走;
- Master根據(jù)SparkContext申請(qǐng)的資源信息和通過心跳獲取的Worker節(jié)點(diǎn)信息,選擇一個(gè)Worker節(jié)點(diǎn)獲取相應(yīng)的資源贾陷,同時(shí)在該節(jié)點(diǎn)上啟動(dòng)StandaloneExecutorBackend進(jìn)程缘眶;
- StandaloneExecutorBackend向SparkContext注冊(cè);
- SparkContext會(huì)將Application程序發(fā)送給StandaloneExecutorBackend髓废,同時(shí)解析Application代碼巷懈,獲取DAG有向無環(huán)圖,然后將DAG交給DAGScheduler構(gòu)建成Stages(每當(dāng)Action動(dòng)作時(shí)慌洪,就會(huì)催生Job顶燕,每個(gè)Job可以包含多個(gè)Stage,每個(gè)Stage會(huì)有多個(gè)Task冈爹,Stage會(huì)在獲取外部數(shù)據(jù)和shuffle之前產(chǎn)生)涌攻,之后DAGScheduler會(huì)將Stage交給TaskScheduler,TaskScheduler會(huì)根據(jù)Worker節(jié)點(diǎn)資源剩余情況向Worker分配相應(yīng)的任務(wù),最后提交給StandaloneExecutorBackend進(jìn)行執(zhí)行频伤;
- 5.StandaloneExecutorBackend進(jìn)程會(huì)根據(jù)Application程序創(chuàng)建一個(gè)Executor線程池恳谎,來執(zhí)行每個(gè)任務(wù),同時(shí)會(huì)將任務(wù)執(zhí)行情況發(fā)送給SparkContext;
- 6.SparkContext監(jiān)聽到最后一個(gè)Task完成時(shí)憋肖,向Master注銷因痛,并釋放所有資源;
yarn-client模式
Spark on yarn運(yùn)行模式根據(jù)Driver運(yùn)行位置可以分為:yarn-client模式和yarn-cluster模式(也就是Yarn-standalone模式)
其yarn-client模式是因?yàn)镈river運(yùn)行在本地岸更,所以client可以和Spark Application進(jìn)行交互鸵膏,通過WebUI進(jìn)行訪問;
yarn-client運(yùn)行過程圖如下:
過程說明如下:
- Spark Yarn Client運(yùn)行Application的Driver程序創(chuàng)建SparkContext怎炊,SparkContext會(huì)向Yarn ResourceManager申請(qǐng)運(yùn)行AppMaster節(jié)點(diǎn)谭企,同時(shí)會(huì)初始化DAGScheduler和TaskScheduler用僧,由于是yarn-client模式,所以會(huì)選擇YarnClientClusterScheduler和YarnClientClusterBackend;
- ResourceManager在收到請(qǐng)求后赞咙,會(huì)找到一個(gè)NodeManager责循,為該Application運(yùn)行一個(gè)Container作為ApplicationMaster,該ApplicationMaster不運(yùn)行SparkContext,但會(huì)和client保持聯(lián)系進(jìn)行資源分配攀操;
- SparkContext在初始化完成后院仿,會(huì)和ApplicationMaster通信,ApplicationMaster會(huì)根據(jù)任務(wù)信息向ResourceManager申請(qǐng)資源速和;
- ApplicationMaster申請(qǐng)到資源后歹垫,會(huì)聯(lián)系指定的NodeManager,要求在分配的container中啟動(dòng)CoarseGrainedExecutorBackend進(jìn)程颠放,該進(jìn)程啟動(dòng)后會(huì)向Client注冊(cè)并申請(qǐng)task排惨;
- Client中的SparkContext會(huì)根據(jù)CoarseGrainedExecutorBackend的資源信息然后分配相應(yīng)的task,CoarseGrainedExecutorBackend在執(zhí)行task時(shí)會(huì)向Driver匯報(bào)任務(wù)執(zhí)行情況碰凶,這樣Client可以根據(jù)任務(wù)執(zhí)行情況決定是否重啟任務(wù)暮芭;
- 6.SparkContext在執(zhí)行完最后一個(gè)任務(wù)后,會(huì)向ResourceManager注銷并釋放掉所有資源欲低;
Yarn-cluster模式
客戶端通過向Yarn cluster提交應(yīng)用程序的方式來執(zhí)行數(shù)據(jù)處理辕宏,那么Yarn會(huì)將該Application作為兩個(gè)步驟來完成:
- 1.第一個(gè)步驟是把Application的Driver程序當(dāng)做ApplicationMaster來在集群中運(yùn)行;
- 2.第二個(gè)步驟是ApplicationMaster創(chuàng)建SparkContext,并向ResourceManager申請(qǐng)Executor資源砾莱,然后在申請(qǐng)到的資源上執(zhí)行任務(wù)瑞筐,并監(jiān)控任務(wù)執(zhí)行情況直到任務(wù)結(jié)束;
其具體執(zhí)行流程如下圖:
流程說明如下:
- 1.Client會(huì)向ResourceManager提交Application申請(qǐng);
- 2.ResourceManager在收到Application申請(qǐng)后腊瑟,會(huì)找到一個(gè)NodeManager聚假,該NodeManager會(huì)分配一個(gè)Container作為ApplicationMaster,用來執(zhí)行Driver程序,創(chuàng)建SparkContext,并初始化DAGScheduler和TaskScheduler闰非,因?yàn)檫\(yùn)行模式是Yarn-cluster膘格,所以程序會(huì)選擇YarnClusterScheduler來包裝TaskScheduler;
- ApplicationMaster在SparkContext初始化后,會(huì)向ResourceManager申請(qǐng)資源來執(zhí)行任務(wù)河胎;
- 4.ResourceManager會(huì)根據(jù)任務(wù)信息分配一個(gè)或者多個(gè)NodeManager闯袒,ApplicationMaster在得到分配資源后,會(huì)和NodeManager建立聯(lián)系游岳,要求其啟動(dòng)CoarseGrainedExecutorBackend進(jìn)程政敢; CoarseGrainedExecutorBackend進(jìn)程啟動(dòng)后會(huì)向ApplicationMaster中的SparkContext注冊(cè)并申請(qǐng)Task,這一點(diǎn)和standalone模式很像胚迫,只是SparkContext會(huì)在SparkApplication初始化時(shí)使用CoarseGrainedExecutorBackend配合YarnClusterScheduler來進(jìn)行任務(wù)調(diào)度喷户;
- 5.SparkContext會(huì)根據(jù)CoarseGrainedExecutionBackend資源信息分配相應(yīng)的任務(wù),同時(shí)會(huì)監(jiān)控CoarseGrainedExecutionBackend任務(wù)執(zhí)行情況知道結(jié)束访锻;
- 6.ApplicationMaster會(huì)在所有任務(wù)都完成的情況下褪尝,向ResourceManager注銷掉自己并釋放所有資源闹获;
Yarn-client和Yarn-cluster模式區(qū)別:
Yarn-client和Yarn-cluster模式最大區(qū)別在于是否有ApplicationMaster運(yùn)行Driver,在Yarn-client中由Client運(yùn)行Driver河哑,而ApplicationMaster主要用來向ResourceManager申請(qǐng)Containers來作Executor避诽,之后由Client和相應(yīng)的Executor所在Container進(jìn)行通信,這樣用戶可以直接查看程序進(jìn)行情況璃谨,比較適合交互式任務(wù)執(zhí)行沙庐;
而在Yarn-cluster中,Driver是運(yùn)行在ApplicationMaster中佳吞,ApplicationMaster不僅要和ResourceManager保持聯(lián)系拱雏,并申請(qǐng)資源,同時(shí)還需要和containers保持聯(lián)系底扳,并下發(fā)任務(wù)和監(jiān)視任務(wù)執(zhí)行情況铸抑;