首先大數據涉及兩個方面:分佈式存儲系統(GFS)和分佈式計算框架(MapReduce)。算法
1.MapReduce包含5 個步驟:Map、Sort、Combine、Shuffle 以及Reduce。這5 個步驟中最重要的就是Map 和Reduce。Map 步驟是在不一樣機器上獨立且同步運行的,它的主要目的是將數據轉換爲 key-value 的形式;而 Reduce 步驟是作聚合運算,它也是在不一樣機器上獨立且同步運行的。Map 和 Reduce 中間夾雜着一步數據移動,也就是 shuffle,這步操做會涉及數量巨大的網絡傳輸(network I/O),須要耗費大量的時間。因爲 MapReduce 的框架限制,一個 MapReduce 任務只能包含一次 Map 和一次 Reduce,計算完成以後,MapReduce 會將運算結果寫回到磁盤中(更準確地說是分佈式存儲系統)供下次計算使用。 若是使用的算法模型須要屢次使用數據,那麼整個計算過程會不斷重複往磁盤讀寫中間結果,會引發大量的網絡傳輸和磁盤讀寫。api
Spark使用的RDD就是爲了解決這種問題而開發出來的,Spark使用了一種特殊設計的數據結構,稱爲RDD。RDD的一個重要特徵是,分佈式數據集能夠在不一樣的並行環境當中被重複使用,這個特性將Spark和其餘並行數據流模型框架(如MapReduce)區別開。網絡
1.Spark把運算的中間數據存儲在內儲存中,迭代計算效率更高,Spark中除了基於內存計算外,還有DAG有向無環圖來切分任務的執行前後順序;mapreduce的中間結果須要落地,須要保存到磁盤,這樣必然會有磁盤io操作,影響性能。數據結構
2.spark容錯性高,由於RDD是一組分佈式的存儲在節點內存中的只讀性質的彈性數據集,並且RDD和RDD之間存在依賴關係,某一部分丟失或者出錯,能夠經過整個數據集的計算流程的血緣關係來實現重建;mapreduce的話容錯可能只能從新計算了,成本較高。框架
三、spark更加通用,spark提供了transformation和action這兩大類的多個功能api,另外還有流式處理sparkstreaming模塊、圖計算GraphX等等;mapreduce只提供了map和reduce兩種操做,流計算以及其餘模塊的支持比較缺少。分佈式