spark 特點(diǎn)
spark是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架
具有如下特點(diǎn):
運(yùn)行速度快
Spark使用先進(jìn)的DAG 執(zhí)行引擎靶溜,基于內(nèi)存的執(zhí)行速度可比Hadoop MapReduce快上百倍掰烟,基于磁盤的執(zhí)行速度也能快十倍容易使用
支持使用Scala、Java栏尚、Python和R語(yǔ)言進(jìn)行編通用性
Spark提供了完整而強(qiáng)大的技術(shù)棧,包括SQL查詢喷户、流式計(jì)算隙轻、機(jī)器學(xué)習(xí)和圖算法組件運(yùn)行模式多樣
Spark可運(yùn)行于獨(dú)立的集群模式中,或者運(yùn)行于Hadoop中瞳购,
且可以訪問(wèn) HDFS话侄、HBase、Hive等多種數(shù)據(jù)源
相對(duì)于Hadoop的優(yōu)勢(shì)
Hadoop的一些缺點(diǎn):
表達(dá)能力有限:
計(jì)算都必須要轉(zhuǎn)化成 Map 和 Reduce兩個(gè)操作学赛,難以描述復(fù)雜的數(shù)據(jù)處理過(guò)程磁盤IO開(kāi)銷大:
每次執(zhí)行時(shí)都需要從磁盤讀取數(shù)據(jù)年堆,并且在計(jì)算完成后需要將中間結(jié)果寫入到磁盤中延遲高:
一次計(jì)算可能要分解成多個(gè) MapReduce 任務(wù),任務(wù)銜接涉及IO開(kāi)銷盏浇,延遲高
Spark的優(yōu)點(diǎn):
表達(dá)能力更靈活:
Spark計(jì)算模式也屬于MapReduce变丧,但不局限于此,還提供了多種操作類型IO開(kāi)銷小绢掰,速度更快:
提供了內(nèi)存計(jì)算痒蓬,中間結(jié)果直接放到內(nèi)存中,帶來(lái)了更高的迭代運(yùn)算效率,
更適合迭代運(yùn)算較多的數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)更優(yōu)的運(yùn)行機(jī)制:
基于DAG的任務(wù)調(diào)度執(zhí)行機(jī)制滴劲,要優(yōu)于MapReduce的迭代執(zhí)行機(jī)制攻晒。編程更方便:
相對(duì)于Hadoop需要編寫不少相對(duì)底層代碼,Spark提供多種高層次班挖、簡(jiǎn)介的API
相同的功能鲁捏,代碼量比Hadoop少2~5倍。并提供實(shí)時(shí)交互式編程反饋(后面關(guān)注一下)
Spark有很多優(yōu)勢(shì)萧芙,并不能完全替代Hadoop给梅,主要用于替代Hadoop中的MapReduce。
Spark已經(jīng)很好地融入了Hadoop生態(tài)圈双揪,并成為其中的重要一員破喻。
借助于YARN實(shí)現(xiàn)資源調(diào)度,借助于HDFS實(shí)現(xiàn)分布式存儲(chǔ)盟榴。
不過(guò) Spark對(duì)硬件的要求稍高曹质,對(duì)內(nèi)存和CPU有一定的要求。
Spark 生態(tài)系統(tǒng)
主要包含了Spark Core擎场、Spark SQL羽德、Spark Streaming、MLLib和GraphX 等組件
Spark Core:
Spark Core包含Spark的基本功能迅办,如內(nèi)存計(jì)算宅静、任務(wù)調(diào)度、部署模式站欺、存儲(chǔ)管理等
通常所說(shuō)的Apache Spark姨夹,就是指Spark Core纤垂;Spark SQL:
Spark SQL允許開(kāi)發(fā)人員直接處理RDD,同時(shí)也可查詢Hive磷账、HBase等外部數(shù)據(jù)源峭沦。
Spark SQL的一個(gè)重要特點(diǎn)是其能夠統(tǒng)一處理關(guān)系表和RDD,
使得開(kāi)發(fā)人員可以輕松地使用SQL命令進(jìn)行查詢逃糟,并進(jìn)行更復(fù)雜的數(shù)據(jù)分析吼鱼;Spark Streaming:
Spark Streaming支持高吞吐量、可容錯(cuò)處理的實(shí)時(shí)流數(shù)據(jù)處理绰咽,
其核心思路是將流式計(jì)算分解成一系列短小的批處理作業(yè)菇肃。
Spark Streaming支持多種數(shù)據(jù)輸入源,如Kafka取募、Flume和TCP套接字等琐谤;MLlib(機(jī)器學(xué)習(xí)):
MLlib提供了常用機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn),包括聚類玩敏、分類笑跛、回歸、協(xié)同過(guò)濾等聊品,
降低了機(jī)器學(xué)習(xí)的門檻飞蹂,開(kāi)發(fā)人員只要具備一定的理論知識(shí)就能進(jìn)行機(jī)器學(xué)習(xí)的工作;GraphX(圖計(jì)算):
GraphX是Spark中用于圖計(jì)算的API翻屈,可認(rèn)為是Pregel在Spark上的重寫及優(yōu)化陈哑,
Graphx性能良好,擁有豐富的功能和運(yùn)算符伸眶,能在海量數(shù)據(jù)上自如地運(yùn)行復(fù)雜的圖算法惊窖。
Spark運(yùn)行架構(gòu)
一些基本概念(記住,很重要)
RDD:
是彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset)的簡(jiǎn)稱-
DAG:
是Directed Acyclic Graph(有向無(wú)環(huán)圖)的簡(jiǎn)稱厘贼,反映RDD之間的依賴關(guān)系界酒;- 應(yīng)用 Application:用戶編寫的Spark應(yīng)用程序;
- 作業(yè) Job:一個(gè)作業(yè)包含多個(gè)RDD及作用于相應(yīng)RDD上的各種操作嘴秸;
- 階段 Stage:是作業(yè)的基本調(diào)度單位毁欣,一個(gè)作業(yè)會(huì)分為多個(gè)階段,每個(gè)階段包括多個(gè)任務(wù)
- 任務(wù) Task:運(yùn)行在Executor上的工作單元岳掐;
- Executor:是運(yùn)行在工作節(jié)點(diǎn)(Worker Node)上的一個(gè)進(jìn)程凭疮,負(fù)責(zé)運(yùn)行任務(wù),并為應(yīng)用存儲(chǔ)數(shù)據(jù)串述;
架構(gòu)設(shè)計(jì)
一個(gè)應(yīng)用(Application)由一個(gè)任務(wù)控制節(jié)點(diǎn)(Driver)和若干個(gè)作業(yè)(Job)構(gòu)成执解,
一個(gè)作業(yè)由多個(gè)階段(Stage)構(gòu)成,一個(gè)階段由多個(gè)任務(wù)(Task)組成纲酗。
當(dāng)執(zhí)行一個(gè)應(yīng)用時(shí)衰腌,任務(wù)控制節(jié)點(diǎn)會(huì)向集群管理器(Cluster Manager)申請(qǐng)資源新蟆,
啟動(dòng)Executor,并向Executor發(fā)送應(yīng)用程序代碼和文件右蕊,然后在Executor上執(zhí)行任務(wù)琼稻,
運(yùn)行結(jié)束后,執(zhí)行結(jié)果會(huì)返回給任務(wù)控制節(jié)點(diǎn)尤泽,或者寫到HDFS或者其他數(shù)據(jù)庫(kù)中欣簇。
運(yùn)行基本流程
(1)當(dāng)一個(gè)Spark應(yīng)用被提交時(shí)规脸,首先需要為這個(gè)應(yīng)用構(gòu)建起基本的運(yùn)行環(huán)境坯约,
即由任務(wù)控制節(jié)點(diǎn)(Driver)創(chuàng)建一個(gè)SparkContext,
由SparkContext負(fù)責(zé)和資源管理器(Cluster Manager)的通信以及進(jìn)行資源的申請(qǐng)莫鸭、任務(wù)的分配和監(jiān)控等闹丐。
SparkContext會(huì)向資源管理器注冊(cè)并申請(qǐng)運(yùn)行Executor的資源;
(2)資源管理器為Executor分配資源被因,并啟動(dòng)Executor進(jìn)程卿拴,Executor運(yùn)行情況將隨著“心跳”發(fā)送到資源管理器上;
(3)SparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖(RDD 的依賴關(guān)系梨与、DAG 下面講)堕花,DAG圖提交給DAG調(diào)度器(DAGScheduler)進(jìn)行解析,
將DAG圖分解成多個(gè)“階段”(每個(gè)階段都是一個(gè)任務(wù)集)粥鞋,并且計(jì)算出各個(gè)階段之間的依賴關(guān)系缘挽,
然后把一個(gè)個(gè)“任務(wù)集”提交給底層的任務(wù)調(diào)度器(TaskScheduler)進(jìn)行處理;Executor向SparkContext申請(qǐng)任務(wù)呻粹,
任務(wù)調(diào)度器將任務(wù)分發(fā)給Executor運(yùn)行壕曼,同時(shí),SparkContext將應(yīng)用程序代碼發(fā)放給Executor等浊;
(4)任務(wù)在Executor上運(yùn)行腮郊,把執(zhí)行結(jié)果反饋給任務(wù)調(diào)度器,然后反饋給DAG調(diào)度器筹燕,
運(yùn)行完畢后寫入數(shù)據(jù)并釋放所有資源轧飞。
RDD的設(shè)計(jì)與運(yùn)行原理:
RDD設(shè)計(jì)背景:
很多計(jì)算框架只能支持一些特定的計(jì)算模式,并沒(méi)有提供一種通用的數(shù)據(jù)抽象撒踪。
RDD就是為了滿足這種需求而出現(xiàn)的踪少,它提供了一個(gè)抽象的數(shù)據(jù)架構(gòu),
不同RDD之間的轉(zhuǎn)換操作形成依賴關(guān)系糠涛,可以實(shí)現(xiàn)管道化援奢,從而避免了中間結(jié)果的存儲(chǔ),大大降低了數(shù)據(jù)復(fù)制忍捡、磁盤IO和序列化開(kāi)銷集漾。
RDD概念
一個(gè)RDD就是一個(gè)分布式對(duì)象集合切黔,每個(gè)RDD可以分成多個(gè)分區(qū),每個(gè)分區(qū)就是一個(gè)數(shù)據(jù)集片段具篇,
一個(gè)RDD的不同分區(qū)可以被保存到集群中不同的節(jié)點(diǎn)上纬霞,從而可以在集群中的不同節(jié)點(diǎn)上進(jìn)行并行計(jì)算。
如何得到RDD驱显?
1诗芜、RDD是只讀的記錄分區(qū)的集合,不能直接修改埃疫,只能基于穩(wěn)定的物理存儲(chǔ)中的數(shù)據(jù)集來(lái)創(chuàng)建RDD伏恐。
2、或者通過(guò)在其他RDD上執(zhí)行確定的轉(zhuǎn)換操作(如map栓霜、join和groupBy)而創(chuàng)建得到新的RDD翠桦。
數(shù)據(jù)運(yùn)算:
- 行動(dòng)(Action):執(zhí)行計(jì)算并指定輸出的形式
- 轉(zhuǎn)換(Transformation):指定RDD之間的相互依賴關(guān)系
RDD經(jīng)過(guò)一系列的“轉(zhuǎn)換”操作,每一次都會(huì)產(chǎn)生不同的RDD胳蛮,供給下一個(gè)“轉(zhuǎn)換”使用销凑;
RDD采用了惰性調(diào)用,即在RDD的執(zhí)行過(guò)程中仅炊,真正的計(jì)算發(fā)生在RDD的“行動(dòng)”操作斗幼,
對(duì)于“行動(dòng)”之前的所有“轉(zhuǎn)換”操作,Spark只是記錄下“轉(zhuǎn)換”操作應(yīng)用的一些基礎(chǔ)數(shù)據(jù)集以及RDD生成的軌跡抚垄,即相互之間的依賴關(guān)系蜕窿,而不會(huì)觸發(fā)真正的計(jì)算。
上述這一系列處理稱為一個(gè)“血緣關(guān)系(Lineage)”督勺,即DAG拓?fù)渑判虻慕Y(jié)果渠羞。
采用惰性調(diào)用,通過(guò)血緣關(guān)系連接起來(lái)的一系列RDD操作就可以實(shí)現(xiàn)管道化(pipeline)智哀,
避免了多次轉(zhuǎn)換操作之間數(shù)據(jù)同步的等待次询,而且不用擔(dān)心有過(guò)多的中間數(shù)據(jù),
因?yàn)檫@些具有血緣關(guān)系的操作都管道化了瓷叫,一個(gè)操作得到的結(jié)果不需要保存為中間數(shù)據(jù)屯吊,
而是直接管道式地流入到下一個(gè)操作進(jìn)行處理。
同時(shí)摹菠,這種通過(guò)血緣關(guān)系把一系列操作進(jìn)行管道化連接的設(shè)計(jì)方式盒卸,
也使得管道中每次操作的計(jì)算變得相對(duì)簡(jiǎn)單,保證了每個(gè)操作在處理邏輯上的單一性
RDD特性
-
高效的容錯(cuò)性:
現(xiàn)有的分布式數(shù)據(jù)存儲(chǔ)框架次氨,為了實(shí)現(xiàn)容錯(cuò)必須在集群節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)復(fù)制或者記錄日志蔽介,也就是在節(jié)點(diǎn)之間會(huì)發(fā)生大量的數(shù)據(jù)傳輸,會(huì)帶來(lái)很多IO上的開(kāi)銷。
為什么需要在多個(gè)節(jié)點(diǎn)間進(jìn)行數(shù)據(jù)復(fù)制呢虹蓄?
一方面是為了數(shù)據(jù)的備份犀呼,防止一個(gè)節(jié)點(diǎn)宕機(jī)導(dǎo)致數(shù)據(jù)丟失的問(wèn)題另一方面是考慮了數(shù)據(jù)可能在多個(gè)節(jié)點(diǎn)進(jìn)行處理,每個(gè)節(jié)點(diǎn)處理這個(gè)數(shù)據(jù)都需要進(jìn)行復(fù)制薇组,防止節(jié)點(diǎn)之間修改數(shù)據(jù)對(duì)互相產(chǎn)生影響外臂。
在RDD的設(shè)計(jì)中,數(shù)據(jù)只讀律胀,不可修改宋光,如果需要修改數(shù)據(jù),必須從父RDD轉(zhuǎn)換到子RDD炭菌,由此在不同RDD之間建立了血緣關(guān)系罪佳。所以,RDD是一種天生具有容錯(cuò)機(jī)制的特殊集合娃兽,如果數(shù)據(jù)丟失菇民,只需通過(guò)RDD父子依賴(血緣)關(guān)系重新計(jì)算得到丟失的分區(qū)來(lái)實(shí)現(xiàn)容錯(cuò)
中間結(jié)果持久化到內(nèi)存尽楔。
存放的數(shù)據(jù)可以是Java對(duì)象投储,避免了不必要的對(duì)象序列化和反序列化開(kāi)銷。
RDD之間的依賴關(guān)系:
RDD中不同的操作會(huì)使得不同RDD中的分區(qū)會(huì)產(chǎn)生不同的依賴阔馋。
RDD中的依賴關(guān)系分為窄依賴(Narrow Dependency)與寬依賴(Wide Dependency)玛荞。
對(duì)于窄依賴的RDD,可以以流水線的方式計(jì)算所有父分區(qū)呕寝,不會(huì)造成網(wǎng)絡(luò)之間的數(shù)據(jù)混合勋眯。
對(duì)于寬依賴的RDD,則通常伴隨著Shuffle操作下梢,即首先需要計(jì)算好所有父分區(qū)數(shù)據(jù)客蹋,
然后在節(jié)點(diǎn)之間進(jìn)行Shuffle 然后把 Shuffle 后的數(shù)據(jù)放到子分區(qū)。
兩種依賴關(guān)系的區(qū)別
窄依賴的失敗恢復(fù)更為高效孽江,它只需要根據(jù)父RDD分區(qū)重新計(jì)算丟失的分區(qū)即可讶坯,
而且可以并行地在不同節(jié)點(diǎn)進(jìn)行重新計(jì)算。
對(duì)于寬依賴而言岗屏,單個(gè)節(jié)點(diǎn)失效通常意味著重新計(jì)算過(guò)程會(huì)涉及多個(gè)父RDD分區(qū)辆琅,開(kāi)銷較大。
階段的劃分:
Spark通過(guò)分析各個(gè)RDD的依賴關(guān)系生成了DAG(這里提到DAG了这刷,劃重點(diǎn)M裱獭),
再通過(guò)分析各個(gè) RDD 中的分區(qū)之間的依賴關(guān)系 來(lái)決定如何劃分階段
具體劃分方法是:
在DAG中進(jìn)行反向解析暇屋,遇到寬依賴就斷開(kāi)似袁,遇到窄依賴就把當(dāng)前的RDD加入到當(dāng)前的階段中;
窄依賴可以形成一個(gè)流水線操作,
比如昙衅,7->9->13 可以看成一個(gè)流水線屋彪,8->10->14 可以看成一個(gè)流水線,兩個(gè)互不影響绒尊。
7 到 9畜挥,可以不用等待 8 到 10 這個(gè)轉(zhuǎn)換操作的計(jì)算結(jié)束,
而是繼續(xù)進(jìn)行union操作婴谱,轉(zhuǎn)換得到分區(qū)13蟹但,這樣流水線執(zhí)行大大提高了計(jì)算的效率。
把一個(gè)DAG圖劃分成多個(gè)“階段”以后谭羔,每個(gè)階段都代表了一組關(guān)聯(lián)的华糖、相互之間沒(méi)有Shuffle依賴關(guān)系的任務(wù)組成的任務(wù)集合。
RDD運(yùn)行過(guò)程:
通過(guò)上述對(duì)RDD概念瘟裸、依賴關(guān)系和階段劃分的介紹客叉,結(jié)合之前介紹的Spark運(yùn)行基本流程,
這里再總結(jié)一下RDD在Spark架構(gòu)中的運(yùn)行過(guò)程:
(1)創(chuàng)建RDD對(duì)象话告;
(2)SparkContext負(fù)責(zé)計(jì)算RDD之間的依賴關(guān)系兼搏,構(gòu)建DAG;
(3)DAGScheduler(DAG調(diào)度器)負(fù)責(zé)把DAG圖分解成多個(gè)階段沙郭,每個(gè)階段中包含了多個(gè)任務(wù)佛呻,
每個(gè)任務(wù)會(huì)被任務(wù)調(diào)度器分發(fā)給各個(gè)工作節(jié)點(diǎn)(Worker Node)上的Executor去執(zhí)行。
Spark三種部署方式
獨(dú)立集群管理器(standalone)模式:
Spark框架本身也自帶了完整的資源調(diào)度管理服務(wù)病线,可以獨(dú)立部署到一個(gè)集群中吓著,
而不需要依賴其他系統(tǒng)來(lái)為其提供資源管理調(diào)度服務(wù)。-
Spark on Mesos模式:
Mesos是一種資源調(diào)度管理框架送挑,可以為運(yùn)行在它上面的Spark提供服務(wù)由于Mesos和Spark存在一定的血緣關(guān)系
因此绑莺,Spark這個(gè)框架在進(jìn)行設(shè)計(jì)開(kāi)發(fā)的時(shí)候,就充分考慮到了對(duì)Mesos的充分支持
Spark運(yùn)行在Mesos上惕耕,要比運(yùn)行在YARN上更加靈活纺裁、自然 Spark on YARN模式
Spark可運(yùn)行于YARN之上,與Hadoop進(jìn)行統(tǒng)一部署赡突,即“Spark on YARN”
資源管理和調(diào)度依賴YARN对扶,分布式存儲(chǔ)則依賴HDFS。
一般采用第三種模式惭缰,具有可以共享底層存儲(chǔ)等 優(yōu)點(diǎn)