談談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代碼,大概執行流程如下:
- 根據行動操作划分job
- 每個job內部根據寬依賴划分stage。stage分為ShuffleMapStage和ResultStage。
- 執行stage內部的task。每個stage內部會有許多task,task是Spark的最小執行單元,task的數量取決於RDD的分區數量,spark會優先選擇數據所在的節點啟動task。task分為ShuffleMapTask和ResultTask。ShuffleMapTask返回輸出結果相關信息供后續task使用;ResultTask根據結果大小,會選擇丟棄或者返回給Driver端。
- ......
從上面流程,我們可以簡單總結:
- Spark通過RDD的分區,來保證MR中的並行處理
- Spark通過DAG寬窄依賴,優化了task計算流程,減少了數據落盤的次數
- Spark中也會保障數據本地化,來實現移動計算而非移動數據。
Spark與MapReduce比較
- Spark會中間數據放在內存中,迭代運算效率高。MapReduce的中間計算結果保存在磁盤上,勢必影響整體的運行速度。
- Spark的容錯性高。Spark的RDD可以根據血統來重新生成數據,也可以通過checkpoint來實現容錯。
- Spark更加的通用。Spark提供了許多的算子,可以更便捷的處理數據。
參考
《MapReduce設計模式》
《Hadoop權威指南》
《圖解Spark核心技術與案例實踐》
參考書籍+個人理解,如有偏差,歡迎交流。