1. 程式人生 > >MapReduce程式設計模板及shuffle過程簡介

MapReduce程式設計模板及shuffle過程簡介

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)