简介
本文先介绍Google 开源项目mapreduce1.0版。mapreduce的设计是为实现一个抽象的计算框架,使用者不用关心底层如何实现,只需要关注业务逻辑从而计算海量、复杂的原始数据。
编程模型
设计理念是实现“计算向数据靠拢”,“数据向计算靠拢”会造成大量的I/O消耗,计算过程分为map和reduce阶段。
存储在HDFS中的数据被切分成很多块,这些块可以分发到多个map任务并行处理,生成一个内部有序外部无序的key/value数据集作为reduce任务的输入,由reduce执行最后的合并计算,最终形成一个按照key规则排序的计算结果。
Map
- 输入数据被切分成逻辑数据集合,该切分并不是物理意义的切分,只是记录了数据的开始和结束的长度,切分规则由blocksize,maxsize,minsize这三个属性的中间值决定,一般一个block就是一个map任务。
- map任务被分发到多台机器执行,每个map任务最后生成一个“外部无序内部有序”的key/value集合,并缓存在内存中
- 为了减少磁盘I/O带来的消耗,在2.0版本中,map计算结果不再落地写入本地,直接从内存通过网络传给执行reduce任务的计算机
从上得知,map最主要的任务就是完成数据的分发并行计算。
Reduce
- 当所有map任务完成后,如果map没有进行combiner(合并),将会输出<key,value(v1,v2,v3)>的结果作为reduce的输入
- 同一个key/value集合调用一次red