1.RDD 的編程模型更簡單。
Spark編程關(guān)注的數(shù)據(jù)是RDD,RDD是個(gè)抽象的,是一次計(jì)算階段中 要操作的所有的數(shù)據(jù)的抽象,雖然它們是分片的,并且分布在HDFS的任意節(jié)點(diǎn)上,但是概念上,我們是針對這個(gè)抽象的RDD編程的。使用Scala編程,wordcount只需要三行代碼,很簡單是吧,但是背后的整體的計(jì)算過程是相當(dāng)?shù)膹?fù)雜的。這樣看我們在MapReduce中的編程要是關(guān)注所有的數(shù)據(jù)的,默認(rèn)為map的數(shù)據(jù)輸入的數(shù)據(jù)是整個(gè)要處理的數(shù)據(jù),并不是說,其他的應(yīng)用就不知道了,畢竟我們也可以在代碼中感知到在文件中的偏移量這種東西。
2.DAG 切分的多階段計(jì)算過程更快速。
和 MapReduce 一個(gè)應(yīng)用一次只運(yùn)行一個(gè) map 和一個(gè) reduce 不同,Spark 可以根據(jù)應(yīng)用的復(fù)雜程度,分割成更多的計(jì)算階段(stage),這些計(jì)算階段組成一個(gè)有向無環(huán)圖 DAG,Spark 任務(wù)調(diào)度器可以根據(jù) DAG 的依賴關(guān)系執(zhí)行計(jì)算階段Spark計(jì)算框架編程和運(yùn)行速度比MapReduce更加的簡單和快。
3.使用內(nèi)存存儲(chǔ)中間計(jì)算結(jié)果更高效。
和 Hadoop MapReduce 主要使用磁盤存儲(chǔ) shuffle 過程中的數(shù)據(jù)不同,Spark 優(yōu)先使用內(nèi)存進(jìn)行數(shù)據(jù)存儲(chǔ),包括 RDD 數(shù)據(jù)。除非是內(nèi)存不夠用了,否則是盡可能使用內(nèi)存, 這也是 Spark 性能比 Hadoop 高的另一個(gè)原因。
Spark的多個(gè)計(jì)算階段的理解:
相比于MapReduce只有兩個(gè)計(jì)算階段, Spark理論上可以有無限個(gè)計(jì)算階段, 這也是Spark的速度的優(yōu)勢
Spark的計(jì)算階段的表示中,DAG(有向無環(huán)圖)是Spark的關(guān)鍵,DAG可以很好的表示每個(gè)計(jì)算階段的關(guān)系,或者說依賴書序
那么DAG是誰生成的呢,是根據(jù)什么生成的呢?
DAG是有Spark計(jì)算框架根據(jù)用于所寫的代碼生成的,那怎么依據(jù)代碼的什么生成的呢?
類比MapReduce的兩個(gè)計(jì)算階段,兩個(gè)階段之間的過度是什么?是shuffle,Spark也是根據(jù)Spark中的代碼中的轉(zhuǎn)換函數(shù)是否是有shuffle操作進(jìn)行劃分階段的!
Spark的每個(gè)計(jì)算階段可以類比MapReduce中的Map階段或者Reduce階段。不同的是,Spark計(jì)算階段關(guān)注的是RDD,但是又有相同的點(diǎn),RDD中的數(shù)據(jù)組成也是一片一片的,Spark中的最小的任務(wù)也就是對于片的計(jì)算,原理和MapReduce一樣,Spark中的片和MapReduce中的片是通一個(gè)東西,每個(gè)片都是分布于HDFS上的,對于每個(gè)片的計(jì)算大概率也是在片所在的計(jì)算節(jié)點(diǎn)的。所以Spark的計(jì)算也是分布式,并且原理和MapReduce是一樣的。
Spark中RDD上的操作函數(shù):RDD上的操作函數(shù)分為兩種類型,一種是轉(zhuǎn)換函數(shù),另一種是action函數(shù)。
另一種是action函數(shù),調(diào)用這種函數(shù)不返回RDD,DAGScheduler在遇到shuffle的時(shí)候生成一個(gè)新的計(jì)算階段,在遇到action函數(shù)的時(shí)候,產(chǎn)生一個(gè)作業(yè)。(
在每個(gè)計(jì)算階段都是針對RDD(包含很多片)的計(jì)算,每個(gè)分片Spark都會(huì)創(chuàng)建一個(gè)計(jì)算任務(wù)去處理,所以每個(gè)計(jì)算階段會(huì)包含很多個(gè)計(jì)算任務(wù)。





暫無評論,快來評論吧!