MapReduce是Google提出的一个软件架构,用于大规模数据集的并行运算。Map(映射)和Reduce(规约),及他们的主要思想,是从函数式编程语言借鉴的(可参考java8中Stream API 中类似的map和reduce函数,但java函数式编程发布的时间较晚)。一个MapReduce过程可简单理解为把一堆杂乱无章的数据按照某种特征归纳起来(Map),然后处理并得到结果(Reduce)。
MapReduce的应用场景往往都具有一个共同的特点:任务可被分解成相互独立的子问题,MapReduce编程模型可分为5个步骤:
(1)迭代。遍历输入数据,将之解析为key/value对。
(2)将输入key/value对映射成另外一些key/value对(map)。
(3)依据key对中间数据进行分组(grouping)
(4)以组为单位对数据进行规约(reduce)
(5)迭代。将最终产生的key/value对保存到输出文件中。
MapReduce将计算过程分解为以上5个步骤带来的最大好处就是组件化和并行化。
开发者可通过简单实现一些接口,就可以完成一个分布式程序。无需关心分布式程序中其他细节,如数据分片,数据传输、节点间通信等,这些细节都被抽象成公共模块并由系统实现,开发者只需要关注自己应用程序的逻辑实现,从而大大降低了分布式程序编写的门槛。
MapReduce的另一个优点就是良好的拓展性。当数据量积累到一定程度后,现有集群无法达到要求的计算能力和存储能力,就可以通过增加机器以达到线性拓展集群能力的目的。
MapReduce还具有高容错性。在分布式环境下,尤其是随着集群规模的增大,集群中的故障率也会随之提升(磁盘损坏、机器宕机、节点间通信失败和用户程序的bug等),进而可能导致任务失败和数据丢失。为此,Hadoop通过计算迁移或者数据迁移等策略以保障集群的容错性和高可用。
然而,MapReduce也有自身的局限性。
首先,MapReduce只能处理可以被分解为多个独立部分的任务,如果任务之间相互依赖彼此的结果,就不能用MapReduce来解决。
其次,MapReduce依赖的数据都是来自文件。整个计算过程涉及到大量的文件IO,势必会影响计算的速度。
另外,MapReduce适用于离线数据的处理(日活),而无法处理实时数据。