1 MapReduce概述;
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.
MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。
这两个函数的形参是key、value对,表示函数的输入信息。
2 执行步骤:
1. map任务处理:
1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
1.3 对输出的key、value进行分区。
1.4 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
1.5 (可选)分组后的数据进行归约。
2.reduce任务处理:
2.1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2.2 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
2.3 把reduce的输出保存到文件中。
例子:实现WordCountApp
3 问题:
MapReduce框架的结构是什么
Map在整个MR框架中作用是什么
Reduce在整个MR框架中作用是什么
4 代码:
1 map 任务处理
hdfs:原始数据:
hello tom
hello jerry
hello kitty
hello world
hello tom
计算:<k1,v1> 内容字符的偏移量
map阶段(逐行读取hdfs的数据):
<0,"hello tom">
<10,"hello jerry">
<22,"hello kitty">
<34,"hello world">
<46,"hello tom">
map(){
//0
int key=k1;
//"hello tom"
String value=v1;
String[] words=value.split(" ");
for(String w:words){
context.write(w,1);
}
}
Reduce阶段<k2,v2>
数据解析和合并
<hello,{1,1,1,1,1}>
<jerry,{1}>
<kitty,{1}>
<tom,{1,1}>
<world,{1}>
reduce(){
int counter=0;
for(int i:v2s){
counter+=i;
}
context.write(key,counter);
}
组装map和Reduce 组合
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
//conf.setInt("mapreduce.client.submit.file.replication", "20");
Job job = Job.getInstance(conf);
//notice
job.setJarByClass(WordCount.class);
//set mapper`s property
job.setMapperClass(WCMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//FileInputFormat.setInputPaths(job, new Path("/root/words.txt"));
FileInputFormat.setInputPaths(job, new Path("/root/words"));
//set reducer`s property
job.setReducerClass(WCReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job, new Path("/root/wcout"));
//submit
job.waitForCompletion(true);
}
===========================
MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题.
MR由两个阶段组成:Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,非常简单。
这两个函数的形参是key、value对,表示函数的输入信息。
2 执行步骤:
1. map任务处理:
1.1 读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
1.2 写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
1.3 对输出的key、value进行分区。
1.4 对不同分区的数据,按照key进行排序、分组。相同key的value放到一个集合中。
1.5 (可选)分组后的数据进行归约。
2.reduce任务处理:
2.1 对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。
2.2 对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
2.3 把reduce的输出保存到文件中。
例子:实现WordCountApp
3 问题:
MapReduce框架的结构是什么
Map在整个MR框架中作用是什么
Reduce在整个MR框架中作用是什么
4 代码:
1 map 任务处理
hdfs:原始数据:
hello tom
hello jerry
hello kitty
hello world
hello tom
计算:<k1,v1> 内容字符的偏移量
map阶段(逐行读取hdfs的数据):
<0,"hello tom">
<10,"hello jerry">
<22,"hello kitty">
<34,"hello world">
<46,"hello tom">
map(){
//0
int key=k1;
//"hello tom"
String value=v1;
String[] words=value.split(" ");
for(String w:words){
context.write(w,1);
}
}
Reduce阶段<k2,v2>
数据解析和合并
<hello,{1,1,1,1,1}>
<jerry,{1}>
<kitty,{1}>
<tom,{1,1}>
<world,{1}>
reduce(){
int counter=0;
for(int i:v2s){
counter+=i;
}
context.write(key,counter);
}
组装map和Reduce 组合
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
//conf.setInt("mapreduce.client.submit.file.replication", "20");
Job job = Job.getInstance(conf);
//notice
job.setJarByClass(WordCount.class);
//set mapper`s property
job.setMapperClass(WCMapper.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
//FileInputFormat.setInputPaths(job, new Path("/root/words.txt"));
FileInputFormat.setInputPaths(job, new Path("/root/words"));
//set reducer`s property
job.setReducerClass(WCReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
FileOutputFormat.setOutputPath(job, new Path("/root/wcout"));
//submit
job.waitForCompletion(true);
}
===========================