大數據軟件比較
分布式的簡單理解
在分布式系統出現之前,只有通過不斷增加單個處理機的頻率和性能來縮短數據的處理時間,分布式則將一個復雜的問題切割成很多的子任務,分布到多台機器上並行處理,在保證系統穩定性的同時,最大限度提高系統的運行速度。
MapReduce
模型整體分析
關於MapReduce的內容參照即將發布的博文MapReduce
將大規模數據處理作業拆分成多個可獨立運行的Map任務,分布到多個處理機上進行運行,通過shuffle機制處理並產生一定的中間結果,在通過Reduce任務混洗合並產生最終的輸出文件。
優勢與不足分析
優勢分析:
- MapReduce編程模型使得任務執行和任務通信之間變得簡單且規范,實現任務並行化,擴展性良好;
- 每次Map操作之后,產生的中間結果會保存在磁盤上,不會永久的留在內存中,這樣減少內存的消耗,避免了內存溢出帶來的數據丟失,同時可以更好的容錯;
但是這種設計會產生一定的缺點:
一些不適合使用Map和Reduce操作來完成的問題,如處理圖或者網絡問題時,這些數據結構包含着各種隱性的關系:圖的邊、子樹、節點之間的父子關系、權重等,而這些關系很難被分解為鍵值對在一次計算中完全表示,同時各任務依賴關系比較復雜時,會產生為了適應該處理模型對任務分解造成效率降低的情況。
另外MapReduce的明顯不足: - 為了保證較好的擴展性,MapReduce任務之間相互獨立,互不干擾,造成的后果是產生了大量的中間結果(這些結果保存在磁盤上)需要通過網絡傳輸,占用網絡資源,為了保證容錯,所有的中間結果都保存在了磁盤上(Spark正是解決了此類問題從而提高了特定場景的效率),效率不高;2. 在MapReduce中只有等待所有的(可能在Map任務完成到一定閾值則可以開始啟動Reduce任務,有待說明)Map任務結束后,Reduce任務才能進行計算,異步性差,導致資源利用率低。
Spark
關於Spark的內容參照即將發布的博文Spark
計算算法
Spark 是一種基於內存的開源計算框架,在 Spark 中,核心抽象概念就是彈性分布式數據集RDD(resilient distributed datasets) ,該抽象是分布在集群上的只讀型可恢復數據集.用戶可以利用 Spark 中的轉換(transformation)和動作(action)對其進行操作,也可以長期保存在內存中不被回收,這樣,再次使用這部分內容時,不需要再次創建此 RDD.這也是 Spark 在迭代問題中的性能表現要高於 MapReduce 的原因.RDD 通過一種血統(lineage)關系來完成容錯:如果一個 RDD 丟失,那么這個丟失的RDD有充足的信息知道自己是如何從其他RDD轉換而來的,這樣便可以通過再次計算得到丟失的RDD.Spark 是由 Scala 語言實現的,而 Scala 是一種基於 JVM 的函數式編程語言,提供了類似DryadLINQ的編程接口.同時,Spark 還通過修改版的 Scala 解釋器提供交互式編程,用戶可以自由定義集群中的 RDD、函數、變量以及類.
應用場景
在處理迭代問題以及一些低延時問題時,Spark性能要優於MapReduce,而且在MapReduce之上做了很多改進與優化,使得在處理機器學習、圖算法等迭代問題時,具有明顯的優勢。
具體應用場景:
.1. 迭代式算法:很多迭代式算法都會對相同的數據進行重復計算從而得到最優解.MapReduce 計算框架把每次迭代划分成一個或多個 MapReduce 作業(job),而每次迭代都要從磁盤重新加載數據,導致系統效率不高;而 Spark 可以把需要重復計算的數據緩存到內存中加快計算效率;
.2. 交互式數據分析:用戶經常會用 SQL 對大數據集合做臨時查詢(ad-hoc query).Hive 把每次查詢都當作一個獨立的 MapReduce 作業,並且從磁盤加載數據,有很大的延遲;而 Spark 可以把數據加載到內存中,然后重復的查詢;
.3. 流應用:即需要實時處理的應用,這類應用往往需要低延遲、高效率.
不足之處
Spark數據規模過大或內存不足時,會出現性能降低、數據丟失需要進行重復計算等缺點。
MapReduce和Spark對比總結
處理非迭代問題(如WordCount問題)時,MapReduce憑借自身的任務調度策略和shuffle機制,在中間數據傳輸數量以及文件數目方面性能優於Spark;
處理迭代問題(如PageRank問題)和一些低延遲問題時,Spark可以根據數據之間的依賴關系對任務進行合理的划分,相比於MapReduce有效的減少了中間數據傳輸數量和同步的次數,提高了系統的運行效率。
參考文獻
吳信東,嵇聖磑.:MapReduce 與 Spark 用於大數據分析之比較[J].軟件學報,2018,29(6):1770-1791.