1. 程式人生 > >談談Hadoop MapReduce和Spark MR實現

談談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核心技術與案例實踐》
參考書籍+個人理解,如有偏差,歡迎