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





暫無評論,快來評論吧!