MapReduce
一、MapReduce概述
思考
求和:1+3+5+8+2+7+3+4+9+…
MapReduce分布式计算框架
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.
MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。
这两个函数的形参是key、value对,表示函数的输入信息。
MapReduce框架的组成
JobTracker / ResourceManager
TaskTracker / NodeManager
MapReduce原理(参看图 MR原理)
二、MapReduce的执行步骤
map任务处理
- 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
- 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
- 对输出的key、value进行分区。
- 对相同分区的数据,按照key进行排序(默认按照字典顺序进行排序)、分组。相同key的value放到一个集合中。
- (可选)分组后的数据进行归约。
reduce任务处理
- 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程并不是map将数据发送给reduce,而是reduce主动去获取数据。
- 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
- 把reduce的输出保存到文件中。
/**
* 案例:实现WordCount(文件:words.txt)
*/
// 代码实现:
public class WCMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
/**
* key -- 当前行的开始位置在整个文件中的偏移量
* value -- 当前行的内容
* context -- 环境对象
*/
protected void map(LongWritable key, Text value, org.apache.hadoop.mapreduce.Mapper<LongWritable,Text,Text,LongWritable>.Context context) throws java.io.IOException ,InterruptedException {
//获取当前行
String line = value.toString();
//按照空格进行切割,得到当前行单词数组
String [] wds = line.split(" ");
//遍历这个数组,输出词频率
for(String w : wds){
context.write(new Text(w), new LongWritable(1));
}
};
}
public class <