1. MapReduce定义
MapReduce是一个分布式运算程序的编程框架,是用户开发"基于Hadoop的数据分析应用"的核心框架。
MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
2. MapReduce优缺点
2.1 优点
- MapReduce易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的机器上运行,也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。
- 良好扩展性
可以动态增加服务器,解决计算资源不够的问题。
- 高容错性
任何一台机器挂掉,可以将任务转移到其他节点。
- 适合海量数据计算
几千台服务器共同计算。
2.2 缺点
- 不擅长实时计算。
- 不擅长流式计算。
- 不擅长DAG有向无环图计算。
3. MapReduce核心编程思想
4. MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程。
- MrAppMaster:负责整个程序的过程调度及状态协调。
- MapTask:负责Map阶段的整个数据处理流程。
- ReduceTask:负责Reduce阶段的整个数据处理流程。
4.1 Mapper阶段
- 用户自定义的Mapper要继承自己的父类。
- Mapper的输入数据是KV对的形式(KV的类型可以自定义)
- Mapper中的业务逻辑写在map()方法中。
- Mapper的输出数据是KV对的形式(KV的类型可自定义)
- map()方法(MapTask进程)对每一个<K,V>调用一次。
Mapper阶段的输入数据是<偏移量,String的序列类型>
输出数据是<String的序列类型,Int的序列类型>
4.2 Reducer阶段
- 用户自定义的Reducer要继承自己的父类。
- Reducer的输入数据类型对应Mapper的输出数据类型,也是KV。
- Reducer的业务逻辑写在reduce方法中
- ReduceTask进程对每一组相同的<KV>组调用一次reduce方法。
Reducer阶段的输入数据是<String的序列类型,集合类型>
输出数据是<String的序列类型,Int的序列类型>
4.3 Driver阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象。
- 获取配置信息,获取job对象实例。
- 指定本程序的jar包所在的本地路径。
- 关联Mapper/Reducer业务类。
- 指定Mapper输出的ky类型。
- 指定最终输出的数据的kv类型。
- 指定job的输入原始文件所在的目录。
- 指定job的输出结果所在的目录。
- 提交作业。