MapReduce知識整理
MapReduce簡介
MapReduce是一個用於處理海量數據的分佈式計算框架,解決了(數據分佈式存儲,做業調度,容錯,機器間通訊等複雜問題)緩存
MapReduce計算框架和執行流程
運行過程文字描述網絡
1. Map任務處理
1.1 讀取HDFS上的文件,每一行經過InputSplit解析成一個<k,v>,每一個InputSplit都會分配一個Mapper任務,每一個k,v會調用一次map函數。<line0, a b c c>,<line1, d e f>app
1.2 覆蓋map(),接收1.1的<k,v>,轉換爲新的<k,v>輸出。<a,1>,<c,1>,<c,1>,<d,1>,<e,1>框架
1.2.1 上面的輸出會先存放在緩存中,每一個map都有一個環形內存緩衝區用於存儲任務輸出(默認大小100M,io.sort.mb屬性指定),到達閾值0.8(io.sort.spill.percent)就溢寫到指定的本地目錄中分佈式
1.3 對1.2.1的輸出溢寫到磁盤前進行分區(partitioner),默認是一個分區,分區數量是根據reduce的數量來取模。<0,a,1>,<0,b,1>,<0,c,1>,<0,c,1>函數
1.4 分區後按照<k,v>中的k排序以及分組,分組是指相同key的value放到一個集合中。排序後:<a,1>,<b,1>,<c,1>,<c,1>,分組後:<a,{1}>,<b,{1}>,<c,{1,1}>spa
1.5 (可選)對分組後的數據進行歸約,combinerblog
2. Reduce任務處理
2.1 多個map任務的輸出,按照不一樣的分區,經過網絡copy到不一樣的reduce節點上進行shuffle排序
2.2 從map端複製過來的數據首先會寫到reduce端的緩存中,緩存佔用到達必定的閾值後會寫到磁盤中進行partition、combine、排序等過程,若是造成了多個磁盤文件還會進行合併,最後一次合併的結果做爲reduce的輸入而不是寫入到磁盤中。內存
2.3 最後一次合併的結果做爲輸入傳入到reduce任務中,當reduce輸入文件肯定後,整個shuffle操做纔算最終結束,以後就是reduce的計算,並把結果存到hdfs上