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

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