談談Hadoop MapReduce和Spark MR實現


談談MapReduce的概念、Hadoop MapReduce和Spark基於MR的實現

什么是MapReduce?

MapReduce是一種分布式海量數據處理的編程模型,用於大規模數據集的並行運算。

有以下幾個特點:

  • 分而治之,並行處理。

    抽象了map和reduce的計算流程,對於分布式存儲的數據可以並行的進行map處理,之后在reduce端對map結果進行匯總。

  • 移動計算而非移動數據。

    數據的計算傳輸需要大量的磁盤和網絡IO。MapReduce會盡量在數據存儲的節點執行計算,以減少不必要的開銷。

Hadoop MapReduce

我們常說的MapReduce就是Hadoop MapReduce。

Hadoop MapReduce作業被分成一系列運行在分布式集群中的map任務和reduce任務,每個任務都工作在被指定的小的數據自己上,因此負載是遍布集群中各個節點上的。

map任務負責數據的載入、解析、轉換和過濾。MapReduce作業的輸入是一系列儲存在HDFS中的文件。map任務的輸出被稱為中間鍵和中間值,會被發送到reduce端進行后續處理。

每個reduce任務負責處理map任務輸出結果的一個子集。MapReduce確保每個reduce的輸入都是按鍵排序的。

系統執行排序、將map輸出作為輸入傳遞給reduce的過程稱為shuffle。shuffle是MapReduce的心臟,關於shuffle詳情請自己搜索。


Pig和Hive都是對MapReduce更高層次的抽象,他們都會將高級的語言翻譯成一組MapReduce作業,執行計算。

Spark基於MapReduce實現

Spark通過借鑒Hadoop MapReduce,繼承了其分布式並行計算的優點,並改進了MapReduce的一些缺點。

Spark並行處理主要基於其內部RDD和DAG來實現。

RDD(彈性分布式數據集):作為Spark基本編程模型,它是MapReduce模型的擴展和延伸。其運用高效的數據共享概念(分區)和類似MapReduce的操作方式,使得並行計算能高效的進行。

DAG(有向無環圖):Spark使用DAG描述了RDD的依賴關系(寬/窄依賴),維護了RDD間的血緣關系,減少了迭代過程中數據的落地,提高了處理效率。


我們提交一個Spark代碼,大概執行流程如下:

  1. 根據行動操作划分job
  2. 每個job內部根據寬依賴划分stage。stage分為ShuffleMapStage和ResultStage。
  3. 執行stage內部的task。每個stage內部會有許多task,task是Spark的最小執行單元,task的數量取決於RDD的分區數量,spark會優先選擇數據所在的節點啟動task。task分為ShuffleMapTask和ResultTask。ShuffleMapTask返回輸出結果相關信息供后續task使用;ResultTask根據結果大小,會選擇丟棄或者返回給Driver端。
  4. ......

從上面流程,我們可以簡單總結:

  • Spark通過RDD的分區,來保證MR中的並行處理
  • Spark通過DAG寬窄依賴,優化了task計算流程,減少了數據落盤的次數
  • Spark中也會保障數據本地化,來實現移動計算而非移動數據。

Spark與MapReduce比較

  1. Spark會中間數據放在內存中,迭代運算效率高。MapReduce的中間計算結果保存在磁盤上,勢必影響整體的運行速度。
  2. Spark的容錯性高。Spark的RDD可以根據血統來重新生成數據,也可以通過checkpoint來實現容錯。
  3. Spark更加的通用。Spark提供了許多的算子,可以更便捷的處理數據。

參考

《MapReduce設計模式》

《Hadoop權威指南》

《圖解Spark核心技術與案例實踐》


參考書籍+個人理解,如有偏差,歡迎交流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM