Spark和MapReduce都是用來處理海量數據,但是在處理方式和處理速度上卻不同。
第一,spark處理數據是基於內存的,而MapReduce是基於磁盤處理數據的。
MapReduce是將中間結果保存到磁盤中,減少了內存占用,犧牲了計算性能。
Spark是將計算的中間結果保存到內存中,可以反復利用,提高了處理數據的性能。
第二,Spark在處理數據時構建了DAG有向無環圖,減少了shuffle和數據落地磁盤的次數
Spark 計算比 MapReduce 快的根本原因在於 DAG 計算模型。一般而言,DAG 相比MapReduce 在大多數情況下可以減少 shuffle 次數。Spark 的 DAGScheduler 相當於一個改進版的 MapReduce,如果計算不涉及與其他節點進行數據交換,Spark 可以在內存中一次性完成這些操作,也就是中間結果無須落盤,減少了磁盤 IO 的操作。但是,如果計算過程中涉及數據交換,Spark 也是會把 shuffle 的數據寫磁盤的!
Spark 是基於內存的計算,但這不是快的主要原因,要對數據做計算,必然得加載到內存,Hadoop 也是如此,只不過 Spark 支持將需要反復用到的數據給 Cache 到內存中,減少數據加載耗時,所以 Spark 更適用於跑機器學習算法(需要對數據進行反復迭代)。
第三,Spark是粗粒度資源申請,而MapReduce是細粒度資源申請
粗粒度申請資源指的是在提交資源時,spark會提前向資源管理器(yarn,mess)將資源申請完畢,如果申請不到資源就等待,如果申請到就運行task任務,而不需要task再去申請資源。
MapReduce是細粒度申請資源,提交任務,task自己申請資源自己運行程序,自己釋放資源,雖然資源能夠充分利用,但是這樣任務運行的很慢。