提及MapReduce,能夠從思想、模型和運算及應用過程等幾個方面來進行理解。首先,來簡單說說它的思想。MapReduce能夠說是凝結了人類對數據處理工做的基本思想,即分類與彙總。咱們都知道,MapReduce其實分爲兩個階段,即map階段和reduce階段。map階段即映射階段,該階段主要負責對數據進行切分處理,reduce階段即歸約階段,也就是在map階段的處理結果上進行彙總。咱們能夠把它定位成一種用於大規模數據集並行運算的編程(算法)模型。
在實際應用中,MapReduce是Hadoop框架集羣的核心之一,在HDFS的基礎上對海量數據進行運算。先來分別看一下map和reduce的詳細運算過程。java
Map過程:算法
@Override public void map(KEYIN key,VALUEIN value,Context context) throws IOException,InterruptedException{ System.out.println("進入Map"); context.write(KEYOUT, VALUEOUT); }
這裏KEYIN,VALUEIN就是在RecordReader中生成的Key和Value;這裏KEYOUT,VALUEOUT就是map的輸出。以後,Map的輸出到Reduce的輸入中間通過了一個複雜的過程:map的每一個輸出都會先寫入緩存(buffer in memory,默認100MB,能夠在job提交前經過io.sort.mb修改),該100MB的緩存有個閾值80MB(默認0.8)。注意,這裏引入了第三個類Partition。編程
Reduce過程:
在map過程當中強調數據在本地計算,即優先數據在哪就把map任務分配到哪。而reducer是須要從全部map的輸出文件中把屬於本身的copy過來,因此會佔用網絡帶寬。從不一樣task tracker拿到的文件也是先寫入buffer(原理同map的寫入buffer),當buffer中的數據達到閾值,就寫入磁盤。存數據的過程叫merge,merge過程能夠發生在:
(1)內存到內存的merge。默認關閉,若是開啓表示最後若是內存有數據,不會先所有寫入磁盤再回頭跟磁盤上的其它數據一塊兒merge,而是直接在內存中merge,再與磁盤中的其它數據merge。
(2)內存到磁盤的merge。與map端的spill相似。
(3)磁盤到磁盤的merge。最後將全部(2)以後的文件進行最終merge,注意(1)的狀況。
以後開始reduce的過程,即merge的最終輸出是reduce的輸入,reduce的輸出默認是輸出到HDFS上。輸出格式由OutputFormat類肯定。緩存
在這裏須要說起的是Yarn並非MapReduce的替代者,它只是做爲一種計算框架的資源管理系統而存在,因此在理解MapReduce的過程當中,也應該瞭解其與Yarn的關係。尚學堂陳老師指出Yarn的存在有時會對MapReduce存在的問題進行一些補充:
1. Job Tracker存在單點故障;
2. Job Tracker完成太多任務,當MR任務很是多時,形成很大的內存開銷;
3.Task Tracker端,若是兩個大內存消耗的任務一塊兒調度,容易出現OOM,若是隻有Map任務或Reduce任務時會形成資源浪費。
那麼Yarn的機制與MapReduce相比有哪些優點呢? 首先舊的MapReduce主要包括Job Tracker和Task Tracker,Yarn中主要是三個組件:Resource Manager、Node Manager和Application Master。Resource Manager負責全局資源分配,Application Master每一個節點一個,負責當前節點的調度和協調。Node Manager是每臺機器的代理,監控應用程序的資源使用狀況,並彙報給Resource Manager。所以與MapReduce相比,Yarn把資源管理與任務調度的工做分離開來,減小了MapReduce中Job Tracker的壓力。
從上面的講述中不難看出,相對於MapReduce,Yarn也有其自身的優點:
1.Yarn大大減小了Job Tracker的資源消耗,而且讓監測每一個Job子任務狀態的程序分佈式化了;
2.YARN中Application Master是一個可變動部分,用戶能夠對不一樣編程模型編寫本身的AppMst,讓更多類型的編程模型能跑在Hadoop集羣中;
3.在舊的框架裏,Job Tracker一個很大的負擔就是監控Job下任務的運行情況,如今由Application Master去作,而Resource Manager是監測Application Master的運行情況,若是出問題,會將其在其餘機器上重啓。
網絡