MapReduce的概述
MapReduce
MapReduce是一个分布式运算程序的编程框架,MapReduce的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
MapReduce的优点
优点:
- MapReduce易于编程,可以简单的实现一些接口,就可以完成一个分布式程序
- 良好的扩展性,可以通过简单的增加机器来扩展它的计算能力
- 高容错性,其中一台机器挂掉,也可以把上面据算任务转移到其他的节点进行工作
- 适合大数据量得离线处理
缺点
- 不擅长实时计算,无法像mysql一样,快速的响应返回结果
- 不擅长流式数据的计算,因为MapReduce输入的数据都是静态的
- 不擅长DAG-有向无环图的计算
MapReduce的工作流程
- MapReduce的工作流程分为两个部分:Map阶段和Reduce阶段
- Map阶段的并发MapTask,完全并发运行,互不相干
- Reduce阶段的并发Reduce Task,完全互不相干,但是他们的数据依赖于Map将诶段输出的数据
- MapReduce编程模型只包括一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,就只能有多个MapReduce程序,串行运行若干问题细节
MapReduce各组成间的相互配合
一个完整的MapReduce程序在分布式运行时候有三类实例进程
- MrAppMaster:负责整个程序的过程调度及状态协调
- Map Task :负责Map阶段的整个过程处理流程
- Reduce Task:负责Reduce阶段的整个数据处理流程
MapReduce的编程规范
-
Map阶段
- 用户自定义的Map类需要继承父类Mapper
- 确定Map阶段的输入和输出类型,Map阶段的输入和输出类型都是以键值对<k,v>呈现
- 重写map()方法,将Map阶段的逻辑重写在map()方法中
- map()方法中的逻辑(Map Task)对每一个<k,v>调用一次
-
Reduce阶段
- 用户自定义的Reducer类需呀继承父类Reducer
- Reducer阶段的输入类型就是Mapper阶段的输出类型
- 重写reduce()方法,将Reducer的逻辑卸载reduce()方法内
- Reduce Tasl进程对每一组相同k的<k,v>调用一次reduce()方法
-
Driver阶段 相当于Yarn集群的客户端,用于提交整个程序到Yarn集群,提高的是封装了MapReduce程序相关运行参数的job对象 Driver阶段的编写具有程序化的代码,主要分为以下几点
-
获取job对象 Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
-
关联本Driver类 ob.setJarByClass(FlowDriver.class);
-
关联Map和Reduce类 job.setMapperClass(UserMapper.class);
job.setReducerClass(UserReducer.class);
-
设置Map的输入输出类型 job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(FlowBean.class);
-
设置最终的输入输出类型 job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FlowBean.class);
-
设置输入输出路径 FileInputFormat.setInputPaths(job, new Path("输入路径"));
FileOutputFormat.setOutputPath(job, new Path("输出路径"));
-
提交job boolean b = job.waitForCompletion(true);
System.exit(b ? 0 : 1);
|