為什麼Spark比MapReduce快?
MapReduce慢是因為 模型很呆板 ,頻繁的Io操作
Spark快的話不僅是因為它是內存迭代計算吧? 具體什麼是內存迭代計算?
Spark計算比MapReduce快的根本原因在於DAG計算模型。一般而言,DAG相比Hadoop的MapReduce在大多數情況下可以減少shuffle次數。
Spark的DAGScheduler相當於一個改進版的MapReduce,如果計算不涉及與其他節點進行數據交換,Spark可以在內存中一次性完成這些操作,也就是中間結果無須落盤,減少了磁碟IO的操作。
但是,如果計算過程中涉及數據交換,Spark也是會把shuffle的數據寫磁碟的!!!
另外有同學提到,Spark是基於內存的計算,所以快,這也不是主要原因,要對數據做計算,必然得載入到內存,Hadoop也是如此,只不過Spark支持將需要反覆用到的數據給Cache到內存中,減少數據載入耗時,所以Spark跑機器學習演算法比較在行(需要對數據進行反覆迭代)。Spark基於磁碟的計算依然也是比Hadoop快。
剛剛提到了Spark的DAGScheduler是個改進版的MapReduce,所以Spark天生適合做批處理的任務。而不是某些同學說的:Hadoop更適合做批處理,Spark更適合做需要反覆迭代的計算。
Hadoop的MapReduce相比Spark真是沒啥優勢了。但是他的HDFS還是業界的大數據存儲標準。這倆根本沒啥可比的,能夠單MR做完的任務,Spark未必比MR快。至於迭代不迭代的並不是關鍵,其實你在Mapper里對數據做N個操作基本等價於N個窄依賴RDD的連接。
所以說真要比,也是多個MR組成的複雜Job來和Spark比。
MR由於其計算粒度的設計問題,在進行需要多次MR組合的計算時,每次MR除了Shuffle的磁碟開銷外,Reduce之後也會寫到磁碟。
而Spark的DAG實質上就是把計算和計算之間的編排變得更為細緻緊密,使得很多MR任務中需要落盤的非Shuffle操作得以在內存中直接參与後續的運算,並且由於運算元粒度和運算元之間的邏輯關係使得其易於由框架自動地優化(換言之編排得好的MR其實也可以做到)。
另外在進行複雜計算任務的時候,Spark的錯誤恢復機制在很多場景會比MR的錯誤恢復機制的代價低,這也是性能提升的一個點。
你是想問Spark為啥比Hadoop快嗎?
MapReduce只是個演算法啊,而且spark也有MapReduce。
如果你是問Spark為啥比Hadoop快,答案就是spark運算數據全在內存裡面Spark之所以outperform Hadoop的關鍵有二:DAG scheduler和intermediate data in memory。Hadoop用的是AG而不是DAG。一個DAG可以包含多個AG。DAG除了可以提升scheduler效率之外,它同時是Spark Fault tolerance機制-Lineage 追溯的基礎。
1、MapReduce的設計:中間結果保存到文件,可以提高可靠性,減少內存佔用,但是犧牲了性能。2、Spark的設計:數據在內存中進行交換,要快一些,但是內存這個東西,可靠性比不過MapReduce。3、spark可以僅用內存存儲,也可在HDFS上存儲,DAG計算模型在迭代計算上還是比MR的更有效率。4、我們公司就是mapReduce和spark兩者結合使用,應該從應用場景區分,其實沒啥大矛盾!Hadoop更適合做批處理,Spark更適合做需要反覆迭代的計算
其實就是減少落地的原因,不用算一次落地一次。
spark也是應用的MapReduce編程模型啊……(題目讓我看起來很糾結……)spark基於內存的讀寫,減少了磁碟IO、node數據交互的通信時間。這個應該比較能說明問題吧。(figure from:Berkeley Scalable Machine Learining)
以下特指Hadoop的Map Reduce的實現。
Map Reduce相對於Spark「慢」的根本原因是,每次中間結果都需要寫到HDFS上面去,讀的時候也需要從HDFS上讀。而Spark「快「的原因是,它默認把結果寫到內存(或者spill到SSD)上面去。
而內存(SSD)vs HDFS,一眼就能看出哪個更加快了。Spark官網那個100倍提高的就是用大容量內存+SSD版本的Spark去比較依賴於HDFS的Map-Reduce,非要說的話,有點小作弊的感覺,不過這確實是Spark的優勢,可以非常好的利用高速的內存資源。
除去官方的性能比較,也有人做了一些特定case的性能比較,比如
The Truth About MapReduce Performance on SSDs - Cloudera Engineering Blog 給出了替換成SSD後的Map-Reduce的性能,大概提升一倍。
http://research.ijcaonline.org/volume113/number1/pxc3900531.pdf 給出了Spark和Map-Reduce在kmeans方面的比較,可以看到大概也是Spark比Map-Reduce提升的一倍的性能。
可以看到,替換成SSD以後,Map-Reduce的性能不一定會比Spark差非常多。
另外,Spark不是作為Map-Reduce的替代者而出現的。Map-Reduce相對於Spark而言,成本方面有著天然的優勢。
樓主可以參考這篇文章 別再比較Hadoop和Spark了,那不是設計人員的初衷
PS:Spark現在還有專門的一個公司在做維護和優化,而Hadoop的Map-Reduce還是依賴於社區。不過矽谷裡面60%的公司還是使用Map-Reduce,不過都是自己的實現居多。
Hadoop每次計算的結果都要保存到hdfs,然後每次計算都需要從hdfs上讀書數據,磁碟上的I/O開銷比較大。spark一次讀取數據緩存在內存中,內存的數據讀取比磁碟數據讀取快很多。還有一點就是spark的RDD數據結構,RDD在每次transformation後並不立即執行,而且action後才執行,有進一步減少了I/O操作。所以spark比Hadoop運行要快,尤其是對於需要迭代的程序。
spark減少了中間過程的磁碟讀寫
推薦閱讀:
※關於Spark有哪些大牛們的博客?
※第四範式的人工智慧平台 Prophet 有可能替代 Spark 么?
※【博客存檔】Machine Learning With Spark Note 5:構建聚類模型
※Spark 為什麼 不允許 RDD 嵌套(如 RDD[RDD[T]])?
TAG:Spark |