1 定义
MapReduce是分布式计算的编码框架。核心功能是把用户的业务逻辑代码和自带默认组件整合为分布式运算程序,并发运行在Hadoop集群上。
2 优缺点
优点:
(1)易于编程呢个,用户只关心业务逻辑和实现框架的接口。
(2)良好的扩展性:可用动态增加服务器,解决计算资源不足的问题。
(3)高容错性:任何一台节点挂掉之后可用把任务转移到其他节点。
(4)适合海量数据的计算。
缺点:
(1)不擅长实时计算。
(2)不擅长流式计算。(flink可以)
(3)不擅长DAG有向环图计算。(spark可以)
3 核心思想
(1)分布式的运算程序往往需要分成至少2个阶段。
(2)第一个阶段的MapTask并发实例,完全并行运行,互不相干。
(3)第二个阶段的ReduceTask并发实例互不相干,但是他们的数据依赖于上一个阶段的所有MapTask并发实例的输出。
(4)MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行。
4 数据序列化类型
5 MapReduce编程规范
用户编写三个部分:Mapper、Reduce和Driver。
Mapper:
(1)用户自定义的Mapper类要继承系统自己的父类。
(2)Mapper的输入数据是键值(kv)对形式。
(3)Mapper的业务逻辑需要重写在map()方法中。
(4)Mapper的输出数据是键值(kv)对形式。
(5)map()方法(即MapTask进程)对每一个<k,v>键值对调用一次。
Reducer:
(1)用户自定义的Reduce类要继承系统自己的父类。
(2)Reduce的输入数据类型对应Mapper的输出数据类型,即键值(kv)对形式。
(3)Reduce的业务逻辑需要重写在reduce()方法中。
(4)ReduceTask进程对每一组相同key的键值对<k,v>组调用一次reduce()方法。
Driver:
相当于YARN集群的客户端,用来把程序提交到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
main函数中:
(1)获取配置信息以及获取job对象。
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
(2)关联本Driver程序的jar。
job.setJarByClass(WordCountDriver.class);
(3)关联Mapper和Reducer的jar。
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
(4)设置Mapper输出的kv类型。
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
(5)设置最终输出的kv类型。
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
(6)设置输入和输出的路径。
FileInputFormat.setInputPaths(job, new Path("D:\\input"));
FileOutputFormat.setOutputPath(job, new Path("D:\\output"));
(7)提交job。
boolean result = job.waitForCompletion(true);
System.exit(result ? 0 : 1);