MapReduce是一种编程模型和相关的实现,用于处理和生成大数据集。其特点是易于使用,且能处理包括但不限于搜索、数据挖掘等各类现实世界的任务。用户通过Map和Reduce两个函数来定义计算过程。MapReduce模型由Jeffrey Dean和Sanjay Ghemawat提出,并在Google内部得到广泛应用,每天在Google集群上执行超过十万次的MapReduce作业,处理超过二十PB的数据。
在MapReduce模型出现之前,Google的工程师们需要实现数百种特殊目的的计算,处理大量原始数据,如爬取的文档、网页请求日志等,以计算各种衍生数据,例如倒排索引、Web文档的图结构的不同表示形式、每台主机被爬取的页面数量的摘要,以及给定一天中出现频率最高的查询集。这些计算在概念上都是直截了当的,但输入数据量通常很大,且计算必须分布在成百上千台机器之间以在合理的时间内完成,这就涉及到了如何并行计算、数据分发以及错误处理等复杂问题。这些复杂的问题掩盖了原本简单的计算逻辑,使它们被大量复杂的代码所充斥。
为了应对这些复杂性问题,作者设计了一种新的抽象方法,允许我们表达需要执行的简单计算,同时隐藏了那些处理并行化、容错、数据分布和负载平衡等复杂细节。这种抽象方法受到Lisp和其他函数式语言中map和reduce原语的启发,他们意识到大多数计算都涉及将map操作应用于输入中的每个逻辑记录,以计算一组中间键值对。
MapReduce模型主要包括Map阶段和Reduce阶段。在Map阶段,系统会将输入数据集切分为更小的数据块,然后在这些数据块上并行执行用户定义的Map函数。Map函数的作用是将输入数据集中的每个逻辑记录转换为一组中间键值对。然后,MapReduce的运行时系统会对这些中间键值对进行排序,并根据键将它们分组,以便每个键的所有值都能被聚合在一起。
在Reduce阶段,系统将对具有相同键的中间数据值进行处理,通过用户定义的Reduce函数对这些值进行汇总或合并,从而得到最终的输出结果。MapReduce框架会自动处理数据的并行化、机器故障以及机器间的通信调度,以便高效地使用网络和磁盘资源。
分布式计算是处理大数据的首选方式,原因在于它可以在很多普通计算机上分散计算任务,从而解决单一计算机处理能力不足的问题。MapReduce模型就是分布式计算领域的一个重要里程碑,它不仅促进了分布式系统的进一步发展,还对后来的许多分布式计算框架产生了深远的影响。现在,MapReduce不仅在Google内部得到广泛应用,其设计理念也被Hadoop等开源项目所采纳,并应用于大数据处理领域。通过这种简化模型,程序员可以将精力集中在编写map和reduce函数上,而无需关心底层的分布式计算细节。这大大降低了并行编程的门槛,使得大数据处理变得更加高效和可靠。