MapReduce程式設計模板及shuffle過程簡介
阿新 • • 發佈:2019-01-14
MapReduce執行流程(7步):
作業啟動>>>作業初始化>>>任務排程(Yarn)>>>map>>>shuffle>>>reduce>>>作業完成
- MapReduce將整個平行計算過程抽象到兩個函式:
- Map(對映):對一些獨立元素組成的列表的每一個元素進行指定的操作,可以高度並行。
- Reduce(化簡):對一個列表的元素進行合併。
- 一個簡單的MapReduce程式只需要指定map()、reduce()、input和output,剩下的事由框架完成。
- MapReduce模板:
- MapReduce程式設計模板類結構圖:
參考程式碼:
Mapper處理:
private Text mapOutputKey = new Text();
private LongWritable mapOutputValue = new LongWritable(1);
……
String lineValue = value.toString();
String[] splits = lineValue.split("\t");
for (String split : splits) {
mapOutputKey.set(split);
context.write(mapOutputKey, mapOutputValue);
}
Reduce處理:
private LongWritable outputValue = new LongWritable();
……
long sum = 0;
for (LongWritable value : values) {
sum += value.get();
}
outputValue.set(sum);
context.write(key, outputValue);
Driver設定Map
Driver設定Reduce
shuffle:shuffle一部分過程發生在map端,一部分發生在reduce端,如下圖框選部分
Map端shuffle主要包含7部分:
1.環形快取區:預設大小100M mapreduce.task.io.sort.mb
2.partition分割槽:HashPartitioner,決定資料交給哪個reduce處理
3.sort:按照key進行字典順序排序,為了歸約合併
4.combine(可選):預設情況下相當於map階段reduce
5.spill:當環形快取區容量達到80M(0.8),會把快取區的資料寫入本地磁碟(不是HDFS)臨時目錄 mapreduce.map.sort.spill.percent
6.merge:把很多小檔案合併成一個大檔案
7.compress(可選):減輕網路IO的壓力
Reduce端的shuffle相對簡單,每個reduce會從map的輸出結果中拉取自己對應的分割槽資料
1.merge 合併:key相同的檔案進行合併並放置到一起
2.group 分組:相同key的value值放在一起(list)