- 优点
- MapReduce 易于编程,仅仅实现一些简单的接口,就可以完成一个分布式程序。并且部署到廉价的服务器上。
- 良好的扩展性,通过简单的增加服务器就可以增加它的运算性能
- 高容错性,MapReduce设计的初衷就是为了程序能在在廉价的机器上运行, 这就要求具有高容错性。一台机器挂了,就把运算任务转移到另外一台机器,不至于这个任务失败,且不需要人工操作
- 适合pb级别的数据进行离线处理,实现上千台服务器并发工作,提供处理能力。
- 缺点
- 不擅长实时计算
- 不擅长流式计算,MapReduce的输入数据是静态的,提前准备好的。
- 不擅长DAG(有向图)计算,多个程序存在依赖。每个MapReduce结果都会写入磁盘,这样做会导致大量磁盘IO,造成程序性能严重降低。
- MapReduce编程核心思想
- MapReduce 一般分为两个阶段,Map(分)和Reduce(和)
- Map阶段并发MapTask,安全并行运行,互不干扰。
- Reduce阶段的并发ReduceTask,完全互不相关。但是它们依赖上一阶段的所有MapTask的运行结果
- MapReduce编程只能又一个Map阶段和Reduce阶段。
- MapReduce进程
- MrAppMaster:负责整个程序的过程调度及状态协调
- MapTask
- ReduceTask
- MapReduce编程规范
Mapper
阶段
- 用户自定义的Mapper要继承自己的父类
- Mapper的输入数据是KV对的形式
- Mapper中的业务逻辑写在map()方法中
- mapper的输出数据是KV对形式
- map()方法(Map进程)对每一个KV对调用一次
Reducer
阶段
- 用户自定义的Reducer要继承自己的父类
- Reducer的输入类型对应Mapper的输出类型,也是kv
- Reducer的业务逻辑写在reduce()方法中
- ReduceTask进程对每一组形同k的<k,v>组调用一次reduce()方法
- Driver阶段
- 相当于YARN集群的客户端,用于我们整个程序到集群。