概述
MapReduce是一个分布式运算程序的编程框架,是用户开发 基于Hadoop的数据分析应用 的核心框架。MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
为什么要MapReduce
- 海量数据在单机上处理因为硬件资源限制,无法胜任
- 而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度
- 引入MapReduce框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理
编程规范
- 用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
- Mapper的输入数据是KV对的形式(类型可自定义)
- Mapper的输出数据是KV对的形式(类型可自定义)
- Mapper中业务逻辑写在map()方法中
- map()方法(maptask进程)对每一个KV调用一次
- Reducer的输出数据对应Mapper的输出数据类型,也是KV
- Reducer的业务逻辑写在reduce()方法中
- reduce()方法对每一组相同k的KV组调用一次
- 用户自定义的Mapper和Reducer都要继承各自的父类
- 整个程序需要一个Driver来进行提交,提交的是一个描述了各种必要信息的job对象
MapTask并行度决定机制
maptask的并行度决定map阶段的任务处理并发度,进而影响整个job的处理速度,那么,maptask并行实例是否越多越好?其并行度又是如何决定的呢?maptask并行度的决定机制
一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:
将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分成逻辑上的多个split),然后每一个split分配一个maptask并行实例处理