1. 程式人生 > >spark和 mapreduce的比較

spark和 mapreduce的比較

需要 刷新 線程池 情況下 一次 生態 好處 流式處理 結果

網上查閱一些資料,收集整理如下:

1、 通用性

spark更加通用,spark提供了transformation和action這兩大類的多個功能api,另外還有流式處理sparkstreaming模塊、圖計算GraphX等等;mapreduce只提供了map和reduce兩種操作,流計算以及其他模塊的支持比較缺乏。

2、 內存利用和磁盤開銷

MapReduce的設計:中間結果需要寫磁盤,Reduce寫HDFS,多個MR之間通過HDFS交換數據,,可以提高可靠性,減少內存占用,但是犧牲了性能。

Spark默認把結果寫到內存, Spark的DAGScheduler相當於一個改進版的MapReduce,如果計算不涉及與其他節點進行數據交換,Spark可以在內存中一次性完成這些操作,也就是中間結果無須落盤,減少了磁盤IO的操作。(但是,如果計算過程中涉及數據交換,Spark也是會把shuffle的數據寫磁盤的!!!),還有一方面就是對shuffle操作的優化,spark提供Cache機制來支持需要反復叠代計算或者多次數據共享,減少中間文件的生成,減少數據讀取的IO開銷。另外DAG相比MapReduce在大多數情況下可以減少shuffle次數。

3、 任務調度

mapreduce任務調度和啟動開銷大;

spark線程池模型減少task啟動開銷

4、 排序

Spark 避免不必要的排序操作,由於mapreduce會對數據進行排序,所以reduce操作必須等到文件全部生成並進行排序之後才可以進行。spark不是這種自動排序,因此可以生成一點,刷新ShuffleMapTask緩沖區到文件中,然後直接進行reduce。

Hadoop MapReduce是sort-based,進入combine()和reduce()的records必須先sort,這樣的好處在於combine/reduce()可以處理大規模的數據,因為其輸入數據可以通過外排得到(mapper對每段數據先做排序, reducer的shuffle對排好序的每段數據做歸並) 。目前的Spark默認選擇的是hash-based,通常使用 HashMap來對shuffle來的數據進行aggregate,不會對數據進行提前排序。如果用戶需要經過排序的數據,那麽需要自己調用類似sortByKey()的操作。

5、 叠代

mapreduce不適合叠代計算(如機器學習、圖計算等),交互式處理(數據挖掘) 和流式處理(點擊日誌分析), 其中間結果需要落地,需要保存到磁盤,這樣必然會有磁盤io操做,影響性能。

spark把運算的中間數據存放在內存,叠代計算效率更高,更適合做需要反復叠代的計算

mapreduce一個job裏,只有一對M與R,而spark的一個job裏可以有多個M多個R。mapreduce需要好多個job來完成的spark一個job就完成了,而且spark的除了shuffle算子需要落盤,其他的都不需要,省去了io開銷。

6、 錯誤恢復機制

Spark的錯誤恢復機制在很多場景會比MR的錯誤恢復機制的代價低,這也是性能提升的一個點。

spark容錯性高,它通過彈性分布式數據集RDD來實現高效容錯,RDD是一組分布式的存儲在節點內存中的只讀性質的數據集,這些集合是彈性的,某一部分丟失或者出錯,可以通過整個數據集的計算流程的血緣關系來實現重建;mapreduce的話容錯可能只能重新計算了,成本較高。

另外spark提供cache機制,當步驟1-10中第10步計算失敗,假如第九步進行了緩存,那麽就可以不需要重新計算直接取緩存了。

7、 復雜性

spark框架和生態更為復雜,首先有RDD、血緣lineage(保存了RDD的依賴關系)、執行時的有向無環圖DAG、stage劃分等等,很多時候spark作業都需要根據不同業務場景的需要進行調優已達到性能要求;

mapreduce框架及其生態相對較為簡單,對性能的要求也相對較弱,但是運行較為穩定,適合長期後臺運行。

總結,spark生態更為豐富,功能更為強大、性能更佳,適用範圍更廣;mapreduce更簡單、穩定性好、適合離線海量數據挖掘計算。

spark和 mapreduce的比較