mapreduce的思想感觉挺朴素,为啥意义如此重大

一切都要从Google发的那篇论文说起
■网友
这个意义恐怕要从分布式计算说起。我认为分布式计算的初衷是认为任务是可以分割的。大任务可以分割成多个小任务,只要小任务之间相互没有关系,那么放在不同的运算单元下面进行计算则可以大大节省计算时间。然而现实情况是,小任务之间可能存在某种相关性。举个简单的例子。我们现在有两个数列,数据量大概在100KB,我们希望得到两个数列之中最大的数返回。利用分布式的思想,我们可以将两个数列放在两个不同的计算单元,分别求出两个数列各自的最大数,然后将结果汇总再算出两数之间谁比较大返回。假设两个计算单元分享的是同一片内存(多线程编程),则计算完毕之后,任意一个计算单元可以在内存区读取两个值通过比较后返回最大值。现在我们把数组变大到10GB,并把数组数量增加到1000个。这样的数据量下面,我们一般需要计算机集群来提高计算的效率。根据前面的经验,我们可以套用一下模型,每个计算机作为一个计算单元去算一个数组,再让其中一个来汇总结果并求出最大值。可是在实际的工作做,问题并没有那么简单解决。这里我们需要考虑几个问题:当集群的计算机总数增加到一定数量的时候,任意的计算失败或者系统异常是很正常的事情。以上面最大值计算为例,对任一数组的计算失败都有可能造成最终结果的不准确。即使集群中所有的计算机都是使用完全一样的硬件配置,但是实际运算中,并不可能达到所有计算机同时计算好结果直接进入下一步汇总阶段。先算好的计算机需要等待落后的计算机,这在分布式计算中是常见的同步问题。由于计算单元本身不共享内存空间,所以各自计算结束后,要汇总的时候需要选择一台机器,把所有计算结果都发过去,然后求出最终值。MapReduce的设计,从一开始就是要让其可以运行在Commodity Server上面,允许程序运行时出现单点任务错误并且能够自动重启相应的任务。合理定义了各细小任务之间的同步或者称作数据交互的时点。抽象出来的mapper和reducer足够简单(起码在Spark出来之前如此),让分布式计算的门槛被大大降低。这才是整个MapReduce框架重要的意义所在。
■网友
分而治之,把一个大问题拆解成若干个小问题,把一个大型的计算过程拆解成若干个小型计算过程。使一个计算不局限在单台机器上,是最大的意义。很多个廉价计算机组合在一起,运算能力超过了昂贵的大型计算机。


    推荐阅读