概述
-
MapReduce的定义:
- MapReduce是一个分布式运算程序的编程框架
- MapReduce的核心功能是将用户编写的代码和其自带的组件整合成完整的分布式运算程序,并 行运算在Hadoop集群上
-
MapReduce的优缺点
- 优点:
①易于编程
②良好的扩展性
③容错性高:若有一个节点挂了,可以将运算任务转移到另一个节点,不至于任务运行失败
④时候PB级以上的大数据的离线处理 - 缺点:
①不擅长实时计算
②不擅长流式计算:其数据源是静态的
③不擅长DAG(有向图)计算:每个MapReduce作业的结果都要写入磁盘,会造成大量的磁盘 IO,导致性能低下
- 优点:
-
MapReduce编程核心编程思想 (如图)
-
MapReduce进程
一个完整的MapReduce程序在并行运行时由三类实例进程:- MrAppMaster:负责整个程序的过程调度和状态协调
- MapMask:负责整个Map阶段的整据流程处理
- ReduceMask:负责整个Reduce阶段的数据流程处理
-
MapReduce编程规范
- map()方法(MapTask进程)对每个<k,v>调用一次
- ReduceMask进程对每一组相同的k 的<k,v>只调用一次reduce()方法
- Driver类相当于客户端,用于提交整个程序到yarn集群,提交的是封装有整个程序相关运行参数的job对象
-
WordCount案例
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
Text k = new Text();
IntWritable v = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] words = line.split(" ");
for (int i = 0; i < words.length; i++) {
k.set(words[i]);
context.write(k, v);
}
}
}
public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
int sum= 0;
IntWritable value = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
for (IntWritable count : values) {
sum+=count.get();
}
value.set(sum);
context.write(key,value);
}
}
public class WordCountDriver {
public static void main(String[] args) throws Exception {
//获取配置文件和封装任务
Configuration con = new Configuration();
Job job = Job.getInstance(con);
//设置jar加载路径
job.setJarByClass(WordCountDriver.class);
//设置map、reduce类
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//设置map输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置最终输出KV类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置输入输出路径
FileInputFormat.setInputPaths(job,new Path(args[0]));
FileOutputFormat.setOutputPath(job,new Path(args[1]));
//提交
boolean res = job.waitForCompletion(true);
}
}
- 在hadoop集群上运行程序:
- 启动hadoop集群
hadoop jar mapreduce-1.0-SNAPSHOT.jar mr_date0925.WordCountDriver /user/zy/input /user/zy/output