談談Hadoop MapReduce和Spark MR實現

upupfeng發表於2020-07-27

談談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核心技術與案例實踐》


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

相關文章