?Apache Spark是一個圍繞速度、易用性和復(fù)雜分析構(gòu)建的大數(shù)據(jù)處理框架,最初在2009年由加州大學(xué)伯克利分校的AMPLab開發(fā),并于2010年成為Apache的開源項目之一珠移,與Hadoop和Storm等其他大數(shù)據(jù)和MapReduce技術(shù)相比,Spark有如下優(yōu)勢:
Spark提供了一個全面、統(tǒng)一的框架用于管理各種有著不同性質(zhì)(文本數(shù)據(jù)钧惧、圖表數(shù)據(jù)等)的數(shù)據(jù)集和數(shù)據(jù)源(批量數(shù)據(jù)或?qū)崟r的流數(shù)據(jù))的大數(shù)據(jù)處理的需求
官方資料介紹Spark可以將Hadoop集群中的應(yīng)用在內(nèi)存中的運行速度提升100倍暇韧,甚至能夠?qū)?yīng)用在磁盤上的運行速度提升10倍
?目標(biāo):
架構(gòu)及生態(tài)
spark 與?hadoop
運行流程及特點
常用術(shù)語
standalone模式
yarn集群
RDD運行流程
架構(gòu)及生態(tài):
通常當(dāng)需要處理的數(shù)據(jù)量超過了單機尺度(比如我們的計算機有4GB的內(nèi)存,而我們需要處理100GB以上的數(shù)據(jù))這時我們可以選擇spark集群進行計算浓瞪,有時我們可能需要處理的數(shù)據(jù)量并不大锨咙,但是計算很復(fù)雜,需要大量的時間追逮,這時我們也可以選擇利用spark集群強大的計算資源酪刀,并行化地計算,其架構(gòu)示意圖如下:
Spark Core:包含Spark的基本功能钮孵;尤其是定義RDD的API骂倘、操作以及這兩者上的動作。其他Spark的庫都是構(gòu)建在RDD和Spark Core之上的
Spark SQL:提供通過Apache Hive的SQL變體Hive查詢語言(HiveQL)與Spark進行交互的API巴席。每個數(shù)據(jù)庫表被當(dāng)做一個RDD历涝,Spark SQL查詢被轉(zhuǎn)換為Spark操作。
Spark Streaming:對實時數(shù)據(jù)流進行處理和控制漾唉。Spark Streaming允許程序能夠像普通RDD一樣處理實時數(shù)據(jù)
MLlib:一個常用機器學(xué)習(xí)算法庫荧库,算法被實現(xiàn)為對RDD的Spark操作。這個庫包含可擴展的學(xué)習(xí)算法赵刑,比如分類分衫、回歸等需要對大量數(shù)據(jù)集進行迭代的操作。
GraphX:控制圖般此、并行圖操作和計算的一組算法和工具的集合蚪战。GraphX擴展了RDD API,包含控制圖铐懊、創(chuàng)建子圖邀桑、訪問路徑上所有頂點的操作
Spark架構(gòu)的組成圖如下:
Cluster Manager:在standalone模式中即為Master主節(jié)點,控制整個集群科乎,監(jiān)控worker壁畸。在YARN模式中為資源管理器
Worker節(jié)點:從節(jié)點,負責(zé)控制計算節(jié)點茅茂,啟動Executor或者Driver捏萍。
Driver: 運行Application 的main()函數(shù)
Executor:執(zhí)行器,是為某個Application運行在worker node上的一個進程
Spark與hadoop:
Hadoop有兩個核心模塊玉吁,分布式存儲模塊HDFS和分布式計算模塊Mapreduce
spark本身并沒有提供分布式文件系統(tǒng)照弥,因此spark的分析大多依賴于Hadoop的分布式文件系統(tǒng)HDFS
Hadoop的Mapreduce與spark都可以進行數(shù)據(jù)計算,而相比于Mapreduce进副,spark的速度更快并且提供的功能更加豐富
關(guān)系圖如下:
運行流程及特點:
spark運行流程圖如下:
構(gòu)建Spark Application的運行環(huán)境,啟動SparkContext
SparkContext向資源管理器(可以是Standalone,Mesos影斑,Yarn)申請運行Executor資源给赞,并啟動StandaloneExecutorbackend,
Executor向SparkContext申請Task
SparkContext將應(yīng)用程序分發(fā)給Executor
SparkContext構(gòu)建成DAG圖矫户,將DAG圖分解成Stage片迅、將Taskset發(fā)送給Task Scheduler,最后由Task Scheduler將Task發(fā)送給Executor運行
Task在Executor上運行皆辽,運行完釋放所有資源
???? Spark運行特點:
每個Application獲取專屬的executor進程柑蛇,該進程在Application期間一直駐留,并以多線程方式運行Task驱闷。這種Application隔離機制是有優(yōu)勢的耻台,無論是從調(diào)度角度看(每個Driver調(diào)度他自己的任務(wù)),還是從運行角度看(來自不同Application的Task運行在不同JVM中)空另,當(dāng)然這樣意味著Spark Application不能跨應(yīng)用程序共享數(shù)據(jù)盆耽,除非將數(shù)據(jù)寫入外部存儲系統(tǒng)
Spark與資源管理器無關(guān),只要能夠獲取executor進程扼菠,并能保持相互通信就可以了
提交SparkContext的Client應(yīng)該靠近Worker節(jié)點(運行Executor的節(jié)點)摄杂,最好是在同一個Rack里,因為Spark Application運行過程中SparkContext和Executor之間有大量的信息交換
Task采用了數(shù)據(jù)本地性和推測執(zhí)行的優(yōu)化機制
常用術(shù)語:
Application:?Appliction都是指用戶編寫的Spark應(yīng)用程序循榆,其中包括一個Driver功能的代碼和分布在集群中多個節(jié)點上運行的Executor代碼
Driver:?Spark中的Driver即運行上述Application的main函數(shù)并創(chuàng)建SparkContext析恢,創(chuàng)建SparkContext的目的是為了準(zhǔn)備Spark應(yīng)用程序的運行環(huán)境,在Spark中有SparkContext負責(zé)與ClusterManager通信秧饮,進行資源申請氮昧、任務(wù)的分配和監(jiān)控等,當(dāng)Executor部分運行完畢后浦楣,Driver同時負責(zé)將SparkContext關(guān)閉袖肥,通常用SparkContext代表Driver
Executor:?某個Application運行在worker節(jié)點上的一個進程,? 該進程負責(zé)運行某些Task振劳, 并且負責(zé)將數(shù)據(jù)存到內(nèi)存或磁盤上椎组,每個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下历恐,其進程名稱為CoarseGrainedExecutor Backend寸癌。一個CoarseGrainedExecutor Backend有且僅有一個Executor對象, 負責(zé)將Task包裝成taskRunner,并從線程池中抽取一個空閑線程運行Task弱贼, 這個每一個oarseGrainedExecutor Backend能并行運行Task的數(shù)量取決與分配給它的cpu個數(shù)
Cluter Manager:指的是在集群上獲取資源的外部服務(wù)蒸苇。目前有三種類型
Standalon : spark原生的資源管理,由Master負責(zé)資源的分配
Apache Mesos:與hadoop MR兼容性良好的一種資源調(diào)度框架
Hadoop Yarn: 主要是指Yarn中的ResourceManager
Worker:?集群中任何可以運行Application代碼的節(jié)點吮旅,在Standalone模式中指的是通過slave文件配置的Worker節(jié)點溪烤,在Spark on Yarn模式下就是NoteManager節(jié)點
Task:?被送到某個Executor上的工作單元味咳,但hadoopMR中的MapTask和ReduceTask概念一樣,是運行Application的基本單位檬嘀,多個Task組成一個Stage槽驶,而Task的調(diào)度和管理等是由TaskScheduler負責(zé)
Job:?包含多個Task組成的并行計算,往往由Spark Action觸發(fā)生成鸳兽, 一個Application中往往會產(chǎn)生多個Job
Stage:?每個Job會被拆分成多組Task掂铐, 作為一個TaskSet, 其名稱為Stage揍异,Stage的劃分和調(diào)度是有DAGScheduler來負責(zé)的全陨,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發(fā)生shuffle的地方
DAGScheduler:?根據(jù)Job構(gòu)建基于Stage的DAG(Directed Acyclic Graph有向無環(huán)圖)衷掷,并提交Stage給TASkScheduler辱姨。 其劃分Stage的依據(jù)是RDD之間的依賴的關(guān)系找出開銷最小的調(diào)度方法,如下圖
TASKSedulter:?將TaskSET提交給worker運行棍鳖,每個Executor運行什么Task就是在此處分配的. TaskScheduler維護所有TaskSet炮叶,當(dāng)Executor向Driver發(fā)生心跳時,TaskScheduler會根據(jù)資源剩余情況分配相應(yīng)的Task渡处。另外TaskScheduler還維護著所有Task的運行標(biāo)簽镜悉,重試失敗的Task。下圖展示了TaskScheduler的作用
在不同運行模式中任務(wù)調(diào)度器具體為:
Spark on Standalone模式為TaskScheduler
YARN-Client模式為YarnClientClusterScheduler
YARN-Cluster模式為YarnClusterScheduler
將這些術(shù)語串起來的運行層次圖如下:
Job=多個stage医瘫,Stage=多個同種task, Task分為ShuffleMapTask和ResultTask侣肄,Dependency分為ShuffleDependency和NarrowDependency
Spark運行模式:
Spark的運行模式多種多樣,靈活多變醇份,部署在單機上時稼锅,既可以用本地模式運行,也可以用偽分布模式運行僚纷,而當(dāng)以分布式集群的方式部署時矩距,也有眾多的運行模式可供選擇,這取決于集群的實際情況怖竭,底層的資源調(diào)度即可以依賴外部資源調(diào)度框架锥债,也可以使用Spark內(nèi)建的Standalone模式。
對于外部資源調(diào)度框架的支持痊臭,目前的實現(xiàn)包括相對穩(wěn)定的Mesos模式哮肚,以及hadoop YARN模式
本地模式:常用于本地開發(fā)測試,本地還分別 local 和 local cluster
standalone:?獨立集群運行模式
Standalone模式使用Spark自帶的資源調(diào)度框架
采用Master/Slaves的典型架構(gòu)广匙,選用ZooKeeper來實現(xiàn)Master的HA
框架結(jié)構(gòu)圖如下:
該模式主要的節(jié)點有Client節(jié)點允趟、Master節(jié)點和Worker節(jié)點。其中Driver既可以運行在Master節(jié)點上中鸦致,也可以運行在本地Client端潮剪。當(dāng)用spark-shell交互式工具提交Spark的Job時涣楷,Driver在Master節(jié)點上運行;當(dāng)使用spark-submit工具提交Job或者在Eclips鲁纠、IDEA等開發(fā)平臺上使用”new SparkConf.setManager(“spark://master:7077”)”方式運行Spark任務(wù)時总棵,Driver是運行在本地Client端上的
運行過程如下圖:(參考至:http://blog.csdn.net/gamer_gyt/article/details/51833681)
SparkContext連接到Master鳍寂,向Master注冊并申請資源(CPU Core 和Memory)
Master根據(jù)SparkContext的資源申請要求和Worker心跳周期內(nèi)報告的信息決定在哪個Worker上分配資源改含,然后在該Worker上獲取資源,然后啟動StandaloneExecutorBackend迄汛;
StandaloneExecutorBackend向SparkContext注冊捍壤;
SparkContext將Applicaiton代碼發(fā)送給StandaloneExecutorBackend;并且SparkContext解析Applicaiton代碼鞍爱,構(gòu)建DAG圖鹃觉,并提交給DAG Scheduler分解成Stage(當(dāng)碰到Action操作時,就會催生Job睹逃;每個Job中含有1個或多個Stage盗扇,Stage一般在獲取外部數(shù)據(jù)和shuffle之前產(chǎn)生),然后以Stage(或者稱為TaskSet)提交給Task Scheduler沉填,Task Scheduler負責(zé)將Task分配到相應(yīng)的Worker疗隶,最后提交給StandaloneExecutorBackend執(zhí)行;
StandaloneExecutorBackend會建立Executor線程池翼闹,開始執(zhí)行Task斑鼻,并向SparkContext報告,直至Task完成
所有Task完成后猎荠,SparkContext向Master注銷坚弱,釋放資源
yarn:?(參考:http://blog.csdn.net/gamer_gyt/article/details/51833681)
Spark on YARN模式根據(jù)Driver在集群中的位置分為兩種模式:一種是YARN-Client模式,另一種是YARN-Cluster(或稱為YARN-Standalone模式)
Yarn-Client模式中关摇,Driver在客戶端本地運行荒叶,這種模式可以使得Spark Application和客戶端進行交互,因為Driver在客戶端输虱,所以可以通過webUI訪問Driver的狀態(tài)些楣,默認是http://hadoop1:4040訪問,而YARN通過http:// hadoop1:8088訪問
YARN-client的工作流程步驟為:
Spark Yarn Client向YARN的ResourceManager申請啟動Application Master悼瓮。同時在SparkContent初始化中將創(chuàng)建DAGScheduler和TASKScheduler等戈毒,由于我們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
ResourceManager收到請求后横堡,在集群中選擇一個NodeManager埋市,為該應(yīng)用程序分配第一個Container,要求它在這個Container中啟動應(yīng)用程序的ApplicationMaster命贴,與YARN-Cluster區(qū)別的是在該ApplicationMaster不運行SparkContext道宅,只與SparkContext進行聯(lián)系進行資源的分派
Client中的SparkContext初始化完畢后食听,與ApplicationMaster建立通訊,向ResourceManager注冊污茵,根據(jù)任務(wù)信息向ResourceManager申請資源(Container)
一旦ApplicationMaster申請到資源(也就是Container)后樱报,便與對應(yīng)的NodeManager通信,要求它在獲得的Container中啟動CoarseGrainedExecutorBackend泞当,CoarseGrainedExecutorBackend啟動后會向Client中的SparkContext注冊并申請Task
client中的SparkContext分配Task給CoarseGrainedExecutorBackend執(zhí)行迹蛤,CoarseGrainedExecutorBackend運行Task并向Driver匯報運行的狀態(tài)和進度,以讓Client隨時掌握各個任務(wù)的運行狀態(tài)襟士,從而可以在任務(wù)失敗時重新啟動任務(wù)
應(yīng)用程序運行完成后盗飒,Client的SparkContext向ResourceManager申請注銷并關(guān)閉自己
Spark Cluster模式:
在YARN-Cluster模式中,當(dāng)用戶向YARN中提交一個應(yīng)用程序后陋桂,YARN將分兩個階段運行該應(yīng)用程序:
第一個階段是把Spark的Driver作為一個ApplicationMaster在YARN集群中先啟動逆趣;
第二個階段是由ApplicationMaster創(chuàng)建應(yīng)用程序,然后為它向ResourceManager申請資源嗜历,并啟動Executor來運行Task宣渗,同時監(jiān)控它的整個運行過程,直到運行完成
YARN-cluster的工作流程分為以下幾個步驟
Spark Yarn Client向YARN中提交應(yīng)用程序梨州,包括ApplicationMaster程序痕囱、啟動ApplicationMaster的命令、需要在Executor中運行的程序等
ResourceManager收到請求后摊唇,在集群中選擇一個NodeManager咐蝇,為該應(yīng)用程序分配第一個Container,要求它在這個Container中啟動應(yīng)用程序的ApplicationMaster巷查,其中ApplicationMaster進行SparkContext等的初始化
ApplicationMaster向ResourceManager注冊有序,這樣用戶可以直接通過ResourceManage查看應(yīng)用程序的運行狀態(tài),然后它將采用輪詢的方式通過RPC協(xié)議為各個任務(wù)申請資源岛请,并監(jiān)控它們的運行狀態(tài)直到運行結(jié)束
一旦ApplicationMaster申請到資源(也就是Container)后旭寿,便與對應(yīng)的NodeManager通信,要求它在獲得的Container中啟動CoarseGrainedExecutorBackend崇败,CoarseGrainedExecutorBackend啟動后會向ApplicationMaster中的SparkContext注冊并申請Task盅称。這一點和Standalone模式一樣,只不過SparkContext在Spark Application中初始化時后室,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務(wù)的調(diào)度缩膝,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等
ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執(zhí)行岸霹,CoarseGrainedExecutorBackend運行Task并向ApplicationMaster匯報運行的狀態(tài)和進度疾层,以讓ApplicationMaster隨時掌握各個任務(wù)的運行狀態(tài),從而可以在任務(wù)失敗時重新啟動任務(wù)
應(yīng)用程序運行完成后贡避,ApplicationMaster向ResourceManager申請注銷并關(guān)閉自己
Spark Client 和 Spark Cluster的區(qū)別:
理解YARN-Client和YARN-Cluster深層次的區(qū)別之前先清楚一個概念:Application Master痛黎。在YARN中予弧,每個Application實例都有一個ApplicationMaster進程,它是Application啟動的第一個容器湖饱。它負責(zé)和ResourceManager打交道并請求資源掖蛤,獲取資源之后告訴NodeManager為其啟動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區(qū)別其實就是ApplicationMaster進程的區(qū)別
YARN-Cluster模式下井厌,Driver運行在AM(Application Master)中蚓庭,它負責(zé)向YARN申請資源,并監(jiān)督作業(yè)的運行狀況旗笔。當(dāng)用戶提交了作業(yè)之后彪置,就可以關(guān)掉Client拄踪,作業(yè)會繼續(xù)在YARN上運行蝇恶,因而YARN-Cluster模式不適合運行交互類型的作業(yè)
YARN-Client模式下,Application Master僅僅向YARN請求Executor惶桐,Client會和請求的Container通信來調(diào)度他們工作撮弧,也就是說Client不能離開
思考:?我們在使用Spark提交job時使用的哪種模式?
RDD運行流程:
RDD在Spark中運行大概分為以下三步:
創(chuàng)建RDD對象
DAGScheduler模塊介入運算姚糊,計算RDD之間的依賴關(guān)系贿衍,RDD之間的依賴關(guān)系就形成了DAG
每一個Job被分為多個Stage。劃分Stage的一個主要依據(jù)是當(dāng)前計算因子的輸入是否是確定的救恨,如果是則將其分在同一個Stage贸辈,避免多個Stage之間的消息傳遞開銷
示例圖如下:
以下面一個按 A-Z 首字母分類,查找相同首字母下不同姓名總個數(shù)的例子來看一下 RDD 是如何運行起來的
創(chuàng)建 RDD? 上面的例子除去最后一個 collect 是個動作肠槽,不會創(chuàng)建 RDD 之外擎淤,前面四個轉(zhuǎn)換都會創(chuàng)建出新的 RDD 。因此第一步就是創(chuàng)建好所有 RDD( 內(nèi)部的五項信息 )秸仙?
創(chuàng)建執(zhí)行計劃 Spark 會盡可能地管道化嘴拢,并基于是否要重新組織數(shù)據(jù)來劃分 階段 (stage) ,例如本例中的 groupBy() 轉(zhuǎn)換就會將整個執(zhí)行計劃劃分成兩階段執(zhí)行寂纪。最終會產(chǎn)生一個 DAG(directed acyclic graph 席吴,有向無環(huán)圖 ) 作為邏輯執(zhí)行計劃
調(diào)度任務(wù)? 將各階段劃分成不同的 任務(wù) (task) ,每個任務(wù)都是數(shù)據(jù)和計算的合體捞蛋。在進行下一階段前孝冒,當(dāng)前階段的所有任務(wù)都要執(zhí)行完成。因為下一階段的第一個轉(zhuǎn)換一定是重新組織數(shù)據(jù)的拟杉,所以必須等當(dāng)前階段所有結(jié)果數(shù)據(jù)都計算出來了才能繼續(xù)
轉(zhuǎn)自:http://www.cnblogs.com/tgzhu/p/5818374.html