解析spark和mapReduce的區別和優劣

作者:知乎用戶
鏈接:https://www.zhihu.com/question/53354580/answer/307863620
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

首先大數據涉及兩個方面:分佈式存儲系統和分佈式計算框架。前者的理論基礎是GFS。後者的理論基礎爲MapReduce。MapReduce框架有兩個步驟(MapReduce 框架其實包含5 個步驟:Map、Sort、Combine、Shuffle 以及Reduce。這5 個步驟中最重要的就是Map 和Reduce。這也是和Spark 最相關的兩步,因此這裏只討論這兩個步驟):一個是 Map,另一個是 Reduce。Map 步驟是在不同機器上獨立且同步運行的,它的主要目的是將數據轉換爲 key-value 的形式;而 Reduce 步驟是做聚合運算,它也是在不同機器上獨立且同步運行的。Map 和 Reduce 中間夾雜着一步數據移動,也就是 shuffle,這步操作會涉及數量巨大的網絡傳輸(network I/O),需要耗費大量的時間。 由於 MapReduce 的框架限制,一個 MapReduce 任務只能包含一次 Map 和一次 Reduce,計算完成之後,MapReduce 會將運算結果寫回到磁盤中(更準確地說是分佈式存儲系統)供下次計算使用。如果所做的運算涉及大量循環,比如估計模型參數的梯度下降或隨機梯度下降算法就需要多次循環使用訓練數據,那麼整個計算過程會不斷重複地往磁盤裏讀寫中間結果。這樣的讀寫數據會引起大量的網絡傳輸以及磁盤讀寫,極其耗時,而且它們都是沒什麼實際價值的廢操作。因爲上一次循環的結果會立馬被下一次使用,完全沒必要將其寫入磁盤。整個算法的瓶頸是不必要的數據讀寫,而Spark 主要改進的就是這一點。具體地,Spark 延續了MapReduce 的設計思路:對數據的計算也分爲Map 和Reduce 兩類。但不同的是,一個Spark 任務並不止包含一個Map 和一個Reduce,而是由一系列的Map、Reduce構成。這樣,計算的中間結果可以高效地轉給下一個計算步驟,提高算法性能。雖然Spark 的改進看似很小,但實驗結果顯示,它的算法性能相比MapReduce 提高了10~100 倍。另:在MapReduce 框架下,數據的格式都是key-value 形式,其中key 有兩個作用:一方面它被用作統計的維度,類似於SQL 語句裏面的group by 字段,比如正文例子裏的字符;另一方面它又被用作數據的“指南針”決定數據將被髮送到哪臺機器上。而後者是分佈式計算框架的核心。在某些計算場景下,計算本身不需要key 值,或者說不需要Map 這一步,比如對一個數字數組求和。這種情況下,系統會自動地生成一個Map 用於將數據轉換爲key-value 形式,這時key 值就只被用作數據的“指南針”。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章