2.2.2 MapReduce

MapReduce是Google在2004年发表的论文里提出的一个概念[4]。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。MapReduce的核心思想是“分而治之”:将复杂的、运行于大规模集群上的并行计算过程高度地抽象到两个函数(Map和Reduce)中。其理念是“计算向数据靠拢”,而不是“数据向计算靠拢”,这样就减少了大量的网络传输开销。MapReduce是一个分布式运算程序编程框架,需要用户实现业务逻辑代码并与它自带的默认组件整合成完整的分布式运算程序,并行在Hadoop集群上。

MapReduce的优点如下。

1.开发简单、易于编程

MapReduce简单地实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 上运行。用户可以不用考虑进程间通信、套接字编程,不需要非常高深的技巧,只需要实现一些非常简单的逻辑,其他的交由MapReduce计算框架去完成,从而大大简化了分布式程序的编写难度。

2.可扩展性强

当计算资源不能得到满足的时候,可以通过简单地增加机器来扩展它的计算能力。

3.容错性强

对于节点故障导致的作业失败,MapReduce计算框架会自动将作业安排到健康节点上重新执行,直到任务完成,而这一切对于用户来说都是透明的。

4.适合PB级以上海量数据的离线处理

MapReduce适合离线处理而不适合在线处理。例如,在毫秒级内返回一个结果,MapReduce很难做到。

MapReduce不擅长做实时计算、流式计算、DAG(Direct Acyclic Graph,有向无环图)计算。这三种计算的特点如下。

(1)实时计算:MapReduce 无法像 MySQL 一样,在毫秒级或秒级内返回结果。

(2)流式计算:流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。MapReduce 自身的设计特点决定了其数据源必须是静态的。

(3)DAG计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入磁盘,会造成大量的磁盘 I/O(输入/输出),导致性能非常低下。