Hadoop之HDFS01【介紹】
881
2025-03-31
Spark基本架構(gòu)及原理
轉(zhuǎn)自:http://www.cnblogs.com/tgzhu/p/5818374.html
Apache Spark是一個(gè)圍繞速度、易用性和復(fù)雜分析構(gòu)建的大數(shù)據(jù)處理框架,最初在2009年由加州大學(xué)伯克利分校的AMPLab開(kāi)發(fā),并于2010年成為Apache的開(kāi)源項(xiàng)目之一,與Hadoop和Storm等其他大數(shù)據(jù)和MapReduce技術(shù)相比,Spark有如下優(yōu)勢(shì):
Spark提供了一個(gè)全面、統(tǒng)一的框架用于管理各種有著不同性質(zhì)(文本數(shù)據(jù)、圖表數(shù)據(jù)等)的數(shù)據(jù)集和數(shù)據(jù)源(批量數(shù)據(jù)或?qū)崟r(shí)的流數(shù)據(jù))的大數(shù)據(jù)處理的需求。
官方資料介紹Spark可以將Hadoop集群中的應(yīng)用在內(nèi)存中的運(yùn)行速度提升100倍,甚至能夠?qū)?yīng)用在磁盤上的運(yùn)行速度提升10倍。
Spark相比Hadoop MapReduce的優(yōu)勢(shì):
基于MapReduce的計(jì)算引擎通常會(huì)將中間結(jié)果輸出到磁盤上,進(jìn)行存儲(chǔ)和容錯(cuò)。出于任務(wù)管道承接的考慮,當(dāng)一些查詢翻譯到MapReduce任務(wù)時(shí),往往會(huì)產(chǎn)生多個(gè)stage,而這些串聯(lián)的stage又依賴于底層文件系統(tǒng)(如HDFS)來(lái)存儲(chǔ)每一個(gè)stage的輸出結(jié)果。spark將執(zhí)行模型抽象為通用的有向無(wú)環(huán)圖執(zhí)行計(jì)劃(DAG),這可以將多stage的任務(wù)串聯(lián)或者并行執(zhí)行,而無(wú)需將stage中間結(jié)果輸出到HDFS中。類似的引擎包括Dryad、Tez。
數(shù)據(jù)格式和內(nèi)存布局,由于MapReduce Schema on Read處理方式會(huì)引起較大的處理開(kāi)銷。Spark抽象出分布式內(nèi)存存儲(chǔ)結(jié)構(gòu)彈性分布式數(shù)據(jù)集RDD,進(jìn)行數(shù)據(jù)的存儲(chǔ)。RDD能支持粗粒度寫(xiě)操作,但對(duì)于讀操作,RDD可以精確到每條記錄,這使得RDD可以用來(lái)作為分布式索引。Spark的特性是能夠控制數(shù)據(jù)在不同節(jié)點(diǎn)上的分區(qū),用戶可以自定義分區(qū)策略,如Hash分區(qū)等。Shark和Spark SQL在Spark的基礎(chǔ)上實(shí)現(xiàn)了列存儲(chǔ)和列存儲(chǔ)壓縮。
執(zhí)行策略,MapReduce在數(shù)據(jù)Shuffle之前花費(fèi)了大量的時(shí)間來(lái)排序,Spark則可減輕上述問(wèn)題帶來(lái)的開(kāi)銷。因?yàn)镾park任務(wù)在shuffle中不是所有場(chǎng)景都需要排序,所以支持基于Hash的分布式聚合,調(diào)度中采用更為通用的任務(wù)執(zhí)行計(jì)劃圖(DAG),每一輪的輸出結(jié)果都在內(nèi)存緩存。
任務(wù)調(diào)度的開(kāi)銷,傳統(tǒng)的MapReduce系統(tǒng),如Hadoop,是為了運(yùn)行長(zhǎng)達(dá)數(shù)小時(shí)的批量作業(yè)而設(shè)計(jì)的,在某些極端情況下,提交一個(gè)任務(wù)的延遲非常高。Spark采用了事件驅(qū)動(dòng)的類庫(kù)AKKA來(lái)啟動(dòng)任務(wù),通過(guò)線程池復(fù)用線程來(lái)避免進(jìn)程或線程啟動(dòng)和切換開(kāi)銷。
目標(biāo):
架構(gòu)及生態(tài)
Spark與Hadoop
運(yùn)行流程及特點(diǎn)
常用術(shù)語(yǔ)
standalone模式
yarn集群
RDD運(yùn)行流程
通常當(dāng)需要處理的數(shù)據(jù)量超過(guò)了單機(jī)尺寸(比如我們的計(jì)算機(jī)有4GB的內(nèi)存,而我們需要處理100GB以上的數(shù)據(jù))這時(shí)我們可以選擇spark集群進(jìn)行計(jì)算,有時(shí)我們可能需要處理的數(shù)據(jù)量并不大,但是計(jì)算很復(fù)雜,需要大量的時(shí)間,這是我們也可以選擇利用spark集群強(qiáng)大的計(jì)算資源,并行化地計(jì)算,其架構(gòu)示意圖如下:
Spark Core:包含Spark的基本功能;尤其是定義RDD的API、操作以及這兩者上的動(dòng)作。其他Spark的庫(kù)都是構(gòu)建在RDD和Spark Core之上的。
Spark SQL:提供通過(guò)Apache Hive的SQL變體Hive查詢語(yǔ)言(HiveQL)與Spark進(jìn)行交互的API。每個(gè)數(shù)據(jù)庫(kù)表被當(dāng)做一個(gè)RDD,Spark SQL查詢被轉(zhuǎn)換為Spark操作。
Spark Streaming:對(duì)實(shí)時(shí)數(shù)據(jù)流進(jìn)行處理和控制。Spark Streaming允許程序能夠像普通RDD一樣處理實(shí)時(shí)數(shù)據(jù)
MLib:一個(gè)常用機(jī)器學(xué)習(xí)的算法庫(kù),算法被實(shí)現(xiàn)為對(duì)RDD的Spark操作。這個(gè)庫(kù)包含可擴(kuò)展的學(xué)習(xí)算法,比如分類、回歸等需要對(duì)大量數(shù)據(jù)集進(jìn)行迭代的操作
GraphX:控制圖、并行圖操作和計(jì)算的一組算法和工具的集合。GraphX擴(kuò)展了RDD API,包含控制圖、創(chuàng)建子圖、訪問(wèn)路徑上所有頂點(diǎn)的操作
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í)行過(guò)程中,Driver和Worker是兩個(gè)重要角色。Driver程序是應(yīng)用邏輯執(zhí)行的起點(diǎn),負(fù)責(zé)作業(yè)的調(diào)度,即Task任務(wù)的分發(fā),而多個(gè)Worker用來(lái)管理計(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的架構(gòu)中的基本組件:
Cluster Manager:在standalone模式中即為Master主節(jié)點(diǎn),控制整個(gè)集群,監(jiān)控worker。在YARN模式中為資源管理器
Worker:從節(jié)點(diǎn),負(fù)責(zé)控制計(jì)算節(jié)點(diǎn),啟動(dòng)Executor或者Driver。在YARN模式中為NodeManager,負(fù)責(zé)計(jì)算節(jié)點(diǎn)的控制。
Driver:運(yùn)行Application的main()函數(shù)并創(chuàng)建SparkContext。
Executor:執(zhí)行器,在worker node上執(zhí)行任務(wù)的組件、用于啟動(dòng)線程池運(yùn)行任務(wù)。每個(gè)Application擁有獨(dú)立的一組Executor。
SparkContext:整個(gè)應(yīng)用的上下文,控制應(yīng)用的生命周期。
RDD:Spark的基礎(chǔ)計(jì)算單元,一組RDD可形成執(zhí)行的有向無(wú)環(huán)圖RDD Graph。
DAG Scheduler:根據(jù)作業(yè)(task)構(gòu)建基于Stage的DAG,并提交Stage給TaskScheduler。
TaskScheduler:將任務(wù)(task)分發(fā)給Executor執(zhí)行。
SparkEnv:線程級(jí)別的上下文, 存儲(chǔ)運(yùn)行時(shí)的重要組件的引用。
Hadoop有兩個(gè)核心模塊,分布式存儲(chǔ)模塊HDFS和分布式計(jì)算模塊MapReduce
Spark本身并沒(méi)有提供分布式文件系統(tǒng),因此Spark的分析大多依賴于Hadoop的分布式文件系統(tǒng)HDFS
Hadoop的MapReduce與Spark都可以進(jìn)行數(shù)據(jù)計(jì)算,而相比于MapReduce,Spark的速度更快并且提供的功能更加豐富
關(guān)系如下圖:
spark運(yùn)行流程圖如下:
構(gòu)建Spark Application的運(yùn)行環(huán)境,啟動(dòng)SparkContext
SparkContext向資源管理器(可以是Standalone,Mesos,Yarn)申請(qǐng)運(yùn)行Executor資源,并啟動(dòng)StandaloneExecutorbackend
Executor向SparkContext申請(qǐng)Task
SparkContext將應(yīng)用程序分發(fā)給Executor
SparkContext構(gòu)建成DAG圖,將DAG圖分解成Stage、將Taskset發(fā)送給Task Scheduler,最后由Task Scheduler將Task發(fā)送給Executor運(yùn)行
Task在Executor上運(yùn)行,運(yùn)行完釋放所有資源
每個(gè)Application獲取專屬的executor進(jìn)程,該進(jìn)程在Application期間一直駐留,并以多線程方式運(yùn)行Task。這種Application隔離機(jī)制是有優(yōu)勢(shì)的,無(wú)論是從調(diào)度角度看(每個(gè)Driver調(diào)度它自己的任務(wù)),還是從運(yùn)行角度看(來(lái)自不同Application的Task運(yùn)行在不同JVM中),當(dāng)然這樣意味著Spark Application不能跨應(yīng)用程序共享數(shù)據(jù),除非將數(shù)據(jù)寫(xiě)入外部存儲(chǔ)系統(tǒng)
Spark與資源管理器無(wú)關(guān),只要能夠獲取Executor進(jìn)程,并能保持互相通信就可以了
提交SparkContext的Client應(yīng)該靠近Worker節(jié)點(diǎn)(運(yùn)行Executor的節(jié)點(diǎn)),最好是在同一個(gè)Rack里,因?yàn)镾park Application運(yùn)行過(guò)程中SparkContext和Executor之間有大量的信息互換
Task采用了數(shù)據(jù)本地性和推測(cè)執(zhí)行的優(yōu)化機(jī)制
Application:Application都是指用戶編寫(xiě)的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同時(shí)負(fù)責(zé)將SparkContext關(guān)閉,通常用SparkContext代表Driver
Executor:某個(gè)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)程名稱為CoarseGrainedExecutor Backend。一個(gè)CoarseGrainedExecutor Backend有且僅有一個(gè)Executor對(duì)象,負(fù)責(zé)將Task包裝成taskRunner,并從線程池中抽取一個(gè)空閑線程運(yùn)行Task,這個(gè)每一個(gè)CoarseGrainedExecutor Backend能并行運(yùn)行Task的數(shù)量取決于分配給它的cup個(gè)數(shù)
Cluster Manager:指的是在集群上獲取資源的外部服務(wù)。目前有三種類型
standalone:spaark原生的資源管理,由Master負(fù)責(zé)資源的分配
Apache Mesos:與hadoop MR兼容性良好的一種資源調(diào)度框架
Hadoop Yarn:主要指Yarn中的ResourceManager
Worker:集群中任何可以運(yùn)行Application代碼的節(jié)點(diǎn),在Standalone模式中指的是通過(guò)slave文件配置的Worker節(jié)點(diǎn),在Spark on Yarn模式下就是NoteManager節(jié)點(diǎn)
Task:被送到某個(gè)Executor上的工作單元,但HadoopMR中的MapTask和ReduceTask概念一樣,是運(yùn)行Application的基本單位,多個(gè)Task組成一個(gè)Stage,而Task的調(diào)度和管理等是由TaskScheduler負(fù)責(zé)
Job:包含多個(gè)Task組成的并行計(jì)算,往往由Spark Action觸發(fā)生成,一個(gè)Application中往往會(huì)產(chǎn)生多個(gè)Job
Stage:每個(gè)Job會(huì)被拆分成多組Task,作為一個(gè)TaskSet,其名稱為Stage,Stage的劃分和調(diào)度是有DAGScheduler來(lái)負(fù)責(zé)的,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發(fā)生Shuffle的地方
DAGScheduler:根據(jù)Job構(gòu)建基于Stage的DAG(Directed Acyclic Graph有向無(wú)環(huán)圖),并提交Stage給TASKScheduler。其劃分Stage的根據(jù)是RDD之間的依賴的關(guān)系找出開(kāi)銷最小的調(diào)度方法,如下圖
TASKScheduler:將TaskSET提交給Worker運(yùn)行,每個(gè)Executor運(yùn)行什么Task就是在此處分配的,TaskScheduler維護(hù)所有TaskSet,當(dāng)Executor向Driver發(fā)生心跳時(shí),TaskScheduler會(huì)根據(jù)資源剩余情況分配相應(yīng)的Task。另外TaskScheduler還維護(hù)著所有Task的運(yùn)行標(biāo)簽,重試失敗的Task,下圖展示了TaskScheduler的作用
在不同運(yùn)行模式中任務(wù)調(diào)度器具體為:
Spark on Standalone模式為TaskScheduler
YARN-Client模式為YarnClientChusterScheduler
YARN-Chuster模式為YarnClusterScheduler
將這些術(shù)語(yǔ)串起來(lái)的運(yùn)行層次圖如下:
Job=多個(gè)Stage,Stage-多個(gè)同種task,Task分為ShuffleMapTask和ResultTask,Dependency分為ShuffleDependency和NarrowDependency
Spark的運(yùn)行模式多種多樣,靈活多變,部署在單機(jī)上時(shí),既可以用本地模式運(yùn)行,也可以用偽分布模式運(yùn)行,而當(dāng)以分布式集群方式部署時(shí),也有眾多的運(yùn)行模式可供選擇,這取決于集群的實(shí)際情況,底層的資源調(diào)度即可以依賴外部資源調(diào)度框架,也可以使用Spark內(nèi)建的Standalone模式。
對(duì)于外部資源調(diào)度框架的支持,目前的實(shí)現(xiàn)包括相對(duì)穩(wěn)定的Mesos模式,以及hadoop YARN模式。
本地模式:常用于本地開(kāi)發(fā)測(cè)試,本地還分為local和local cluster
Standalone模式使用Spark自帶的資源調(diào)度框架
采用Master/Slaver的典型架構(gòu),選用ZooKeeper來(lái)實(shí)現(xiàn)Master的HA
該模式主要的節(jié)點(diǎn)有Client節(jié)點(diǎn)、Master節(jié)點(diǎn)和Worker節(jié)點(diǎn)。其中Driver既可以運(yùn)行在Master節(jié)點(diǎn)上,也可以運(yùn)行在本地Client端。當(dāng)用spark-shell交互工具提交Spark的Job時(shí),Driver在Master節(jié)點(diǎn)上運(yùn)行;當(dāng)使用spark-submit工具提交Job或者在Eclip、IDEA等開(kāi)發(fā)平臺(tái)上使用“new SparkConf.setManager("spark://master:7077")”方式運(yùn)行Spark任務(wù)時(shí),Driver是運(yùn)行在本地Client端上的。
運(yùn)行過(guò)程如下圖:(參考至:http://blog.csdn.net/gamer_gyt/article/details/51833681)
SparkContext連接到Master,向Master注冊(cè)并申請(qǐng)資源(CPU Core和Memory)
Master根據(jù)SparkContext的資源申請(qǐng)要求和Worker心跳周期內(nèi)報(bào)告的信息決定在哪個(gè)Worker上分配資源,然后在該Worker上獲取資源,然后啟動(dòng)StandaloneExecutorBackend;
StandaloneExecutorBackend向SparkContext注冊(cè);
SparkContext將Application代碼發(fā)送給StandaloneExecutorBackend;并且SaprkContext解析Application代碼,構(gòu)建DAG圖,并提交給DAG Scheduler分解成Stage(當(dāng)碰到Action操作時(shí),就會(huì)催生Job;每個(gè)Job中含有1個(gè)或多個(gè)Stage,Stage一般在獲取外部數(shù)據(jù)和shuffle之間產(chǎn)生),然后以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負(fù)責(zé)將Task分配到相應(yīng)的Worker,最后提交給StandaloneExecutorBackend執(zhí)行;
StandaloneExecutorBackend會(huì)建立Executor線程池,開(kāi)始執(zhí)行Task,并向SparkContext報(bào)告,直至Task完成
所有Task完成后,SparkContext向Maxter注銷,釋放資源
Spark on YARN模式根據(jù)Driver在集群中的位置分為兩種模式:一種是YARN-Client模式,另一種是YARN-Cluster(或稱為YARN-Standalone模式)
Yarn-Client模式中,Driver在客戶端本地運(yùn)行,這種模式可以使得Spark Application和客戶端進(jìn)行交互,因?yàn)镈river在客戶端,所有可以通過(guò)webUI訪問(wèn)Driver的狀態(tài),默認(rèn)是http://hadoop1:4040訪問(wèn),而YARN通過(guò)http://hadoop:8088訪問(wèn)
YARN-client的工作流程步驟為:
Spark Yarn Client向YARN的ResourceManager申請(qǐng)啟動(dòng)Application Master。同時(shí)在SparkContext初始化中將創(chuàng)建DAGScheduler和TASKScheduler等,由于我們選擇的是Yarn-Client模式,程序會(huì)選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
ResourceManager收到請(qǐng)求后,在集群中選擇一個(gè)NodeManager,為該應(yīng)用程序分配第一個(gè)Container,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序的Application,與YARN-Cluster區(qū)別的是在該Application不運(yùn)行SparkContext,只與SparkContext進(jìn)行聯(lián)系進(jìn)行資源的分派
Client中的SparkContext初始化完畢后,與ApplicationMaster建立通訊,向ResourceManager注冊(cè),根據(jù)任務(wù)信息向ResourceManager申請(qǐng)資源(Container)
一旦ApplicationMaster申請(qǐng)到資源(也就是Container)后,便與對(duì)應(yīng)的NodeManager通信,要求它在獲得的Container中啟動(dòng)CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動(dòng)后會(huì)向Client中的SparkContext注冊(cè)并申請(qǐng)Task
client中的SparkContext分配Task給CoarseGrainedExecutorBackend執(zhí)行,CoarseGrainedExecutorBackend運(yùn)行Task并向Driver匯報(bào)運(yùn)行的狀態(tài)和速度,以讓Client隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài),從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)
應(yīng)用程序運(yùn)行完成后,Client的SparkContext向ResourceManager申請(qǐng)注銷并關(guān)閉自己
Spark Cluster模式:
在YARN-Cluster模式中,當(dāng)用戶向YARN中提交一個(gè)應(yīng)用程序后,YARN將兩個(gè)階段運(yùn)行應(yīng)用程序:
第一個(gè)階段是把Spark的Driver作為一個(gè)ApplicationMaster在YARN集群中先啟動(dòng);
第二個(gè)階段是由ApplicationMaster創(chuàng)建應(yīng)用程序,然后為它向ResourceManager申請(qǐng)資源,并啟動(dòng)Executor來(lái)運(yùn)行Task,同時(shí)監(jiān)控它的整個(gè)運(yùn)行流程,直到運(yùn)行完成
YARN-cluster的工作流程分為以下幾個(gè)步驟
Spark Yarn Client向YARN中提交應(yīng)用程序,包括ApplicationMaster程序,啟動(dòng)ApplicationMaster的命令、需要在Executor中運(yùn)行的程序等
ResourceManager收到請(qǐng)求后,在集群中選擇一個(gè)NodeManager,為該應(yīng)用程序分配第一個(gè)Container,要求它在這個(gè)Container中啟動(dòng)應(yīng)用程序的ApplicationMaster,其中ApplicationMaster進(jìn)行SparkContext等的初始化
ApplicationMaster向ResourceManager注冊(cè),這樣用戶可以直接通過(guò)ResourceManager查看應(yīng)用程序的運(yùn)行狀態(tài),然后它將采用輪詢的方式通過(guò)RPC協(xié)議為各個(gè)任務(wù)申請(qǐng)資源,并監(jiān)控它們的運(yùn)行狀態(tài)直到運(yùn)行結(jié)束
一旦ApplicationMaster申請(qǐng)到資源(也就是Container)后,便與對(duì)應(yīng)的NodeManager通信,要求它在獲得的Container中啟動(dòng)CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啟動(dòng)后會(huì)向ApplicationMaster中的SparkContext注冊(cè)并申請(qǐng)Task。這一點(diǎn)和Standalone模式一樣,只不過(guò)SparkContext在Spark Application中初始化時(shí),使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進(jìn)行過(guò)任務(wù)的調(diào)度,其中YarnClusterScheduler只是對(duì)TaskSchedulerImpl的一個(gè)簡(jiǎn)單包裝,增加了對(duì)Executor的等待邏輯等
ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorbackend執(zhí)行,CoarseGrainedExecutorBackend運(yùn)行Task并向ApplicationMaster匯報(bào)運(yùn)行的狀態(tài)和速度,以讓ApplicationMaster隨時(shí)掌握各個(gè)任務(wù)的運(yùn)行狀態(tài),從而可以在任務(wù)失敗時(shí)重新啟動(dòng)任務(wù)
應(yīng)用程序運(yùn)行完成好,ApplicationMaster向ResourceManager申請(qǐng)注銷并關(guān)閉自己
理解YARN-Client和YARN-Cluster深層次的區(qū)別之前先清楚一個(gè)概念:Application Master。在YARN中,每個(gè)Application示例都有一個(gè)ApplicationMaster進(jìn)程,它是Application啟動(dòng)的第一個(gè)容器,它負(fù)責(zé)和ResourceManager打交道并請(qǐng)求資源,獲取資源之后告訴NodeManager為其啟動(dòng)Container。從深層次的含義將YARN-Cluster和YARN-Client模式的區(qū)別其實(shí)就是ApplicationMaster進(jìn)程的區(qū)別。
YARN-Cluster模式下,Driver運(yùn)行在AM(Application Master)中,它負(fù)責(zé)向YARN申請(qǐng)資源,并監(jiān)督作業(yè)的運(yùn)行情況。當(dāng)用戶提交了作業(yè)之后,就可以關(guān)掉Client,作業(yè)會(huì)繼續(xù)在YARN上運(yùn)行,因而YARN-Cluster模式不適合交互類型的作業(yè)。
YARN-Client模式下,Application Master僅僅向YARN請(qǐng)求Executor,Client會(huì)和請(qǐng)求的Container通信來(lái)調(diào)度它們工作,也就是說(shuō)Client不能離開(kāi)
RDD在Spark中運(yùn)行大概分為以下三步:
創(chuàng)建RDD對(duì)象
DAGScheduler模塊介入運(yùn)算,計(jì)算RDD之間的依賴關(guān)系,RDD之間的依賴關(guān)系就形成了DAG
每一個(gè)Job被分為多個(gè)Stage。劃分Stage的一個(gè)主要依據(jù)是當(dāng)前計(jì)算因子的輸入是否是確定的,如果是則將其分在同一個(gè)Stage,避免多個(gè)Stage之間的消息傳遞開(kāi)銷
示例圖如下:
以下面一個(gè)按A-Z首字母分類,查找相同首字母下不同姓名總個(gè)數(shù)的例子來(lái)看一下RDD是如何運(yùn)行起來(lái)的
創(chuàng)建RDD上面的例子除去最后一個(gè)collect是個(gè)動(dòng)作,不會(huì)創(chuàng)建RDD之外,前面四個(gè)轉(zhuǎn)換都會(huì)創(chuàng)建新的RDD。因此第一步就是創(chuàng)建好所有RDD(內(nèi)部的五項(xiàng)信息)?
創(chuàng)建執(zhí)行計(jì)劃Spark會(huì)盡可能的管道化,并基于是否要重新組織數(shù)據(jù)來(lái)劃分階段(stage),例如本例中的groupBy()轉(zhuǎn)換就會(huì)將整個(gè)執(zhí)行計(jì)劃分成兩個(gè)階段執(zhí)行。最終會(huì)產(chǎn)生一個(gè)DAG(directed Acyclic graph,有向無(wú)環(huán)圖)作為邏輯執(zhí)行計(jì)劃
調(diào)度任務(wù)? ?將各個(gè)階段分成不同的任務(wù)(task),每個(gè)任務(wù)都是數(shù)據(jù)和計(jì)算的合體。在進(jìn)行下一階段前,當(dāng)前階段的所有任務(wù)都要執(zhí)行完成。因?yàn)橄乱浑A段的第一個(gè)轉(zhuǎn)換一定是重新組織數(shù)據(jù)的,所有必須等當(dāng)前階段所有結(jié)果數(shù)據(jù)都計(jì)算出來(lái)了才能繼續(xù)。
Spark基本架構(gòu)及原理:https://blog.csdn.net/zjh_746140129/article/details/80463895
軟件開(kāi)發(fā)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。