MapReduce 编程模型是Hadoop的核心部分,具有很强的分布式计算能力,主要包含互相独立的两部分Map阶段和Reduce阶段。
参与Mapping工作的机器可以完全独立工作而不需要知道其他机器上有什么数据;参与Reducing步骤的机器,由于数据之前已经按照key进行了分组,因此其他机器上有什么数据与他毫无关系。参与计算的机器都是互相独立,完全不依赖其他机器的数据,这样就可以很方便写代码,因为所有参与Mapping工作的机器使用一模一样的代码,所有参与Reducing工作的机器也使用一模一样的代码。
MapReduce 中各个阶段过程图
已上图为例,了解执行过程
InputFormat:进行数据预处理,比如验证格式
split:将输入文件分为逻辑上的多个InputSplit
RR:通过RecordReader 根据InputSplit中的信息处理其中的记录,加载数据并转换为合适的Map任务读取的键值对
Map: 程序员编写map函数,对输入的键值对进行处理,并输出key-value对
Combiner:可选阶段,Combiner是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作,这样就提高了宽带的传输效率,但是combiner操作是有风险的,使用它的原则是combiner的输入不会影响到reduce计算的最终输入,例如:如果计算只是求总数,最大值,最小值可以使用combiner,但是做平均值计算使用combiner的话,最终的reduce计算结果就会出错。
Shuffle:将map的输出作为reduce的输入的过程就是shuffle了,这个是mapreduce优化的重点地方。下面会重点写一下
Reduce:将输入的<key,value>进行归并合并 并输出有序的键值对
shuffle过程详解:####
Map端的shuffle过程
- 每个Map任务分配一个缓存,大小默认为100M,设置溢写比例为0.8;
- 分区默认采取哈希函数;
- 排序是默认操作,排序后可以进行合并,但要注意合并不能影响最终结果
- 在Map任务全部结束之前进行归并,得到一个大文件放置在本地磁盘
- 文件归并时,如果溢写文件数量大于3则可以再次启动Combiner,少于三个则不需要
Reduce端的shuffle过程
- Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据
- Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘
- 多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的