概念
MapReduce是多進程,進程空間獨享,方便對資源的管理,消耗更多的啓動時間,時效性不高,適合離線處理,高吞吐。mapreduce是hadoop的批量處理計算框架,主要分爲map、reduce過程。
map:負責將數據處理爲<key,value>形式的數據輸出到reduce
reduce:負責處理map輸出的結果
工作流程
1.從hdfs獲取數據。InputFormat:RecordRead讀取一行數據並使用split函數切割數據,形成<key,value>數據
2.map:map讀取切分的數據。map首先將數據讀入Memerybuffer,當數據量超過Memerybuffer就會向硬盤寫入形成小文件這個過程爲spill。再通過Merge寫在硬盤的數據,根據partition個數按照哈希一致性的原則分配給reduce。
map->reduce會發生shuffle過程,shuffle過程是指從不同的機器把同一個key的數據發送到同一臺機器處理,而key集中在某一臺機器。
3.reduce:根據partition分發數據到reduce,Merge合併處理數據(發生spill過程與mapReduce一樣)
4.dataoutput輸出數據到hdfs
partition個數 跟 reduce個數一樣。
例子分析
wordcount例子分析
1.客戶端提交wordcount作業,將jar包分配到執行的datanode
2.datanode從hdfs讀取數據
3.map先將數據切分<key,value>形式,可以再分發給reduce之前將數據合併能減少網絡傳輸。從圖可知:hello從兩個節點分配到一個reduce(哈希一致性的原則),這個過程發生shuffle過程。
shuffle過程產生數據傾斜:1.通過預處理key如:key_01,key_02來打散 2.會發生數據傾斜的數據過濾,不進去reduce階段,特殊處理
4.reduce處理map數據,合併再輸出到hdfs