MapReduce是由Google开发的针对大规模海量数据处理的分布式计算框架。MapReduce处理数据的两个核心阶段是Map(映射)和Reduce(化简)。简单地来,Map负责将数据打散,Reduce负责对数据进行聚集。
下面,我们利用MapReduce解决一个有趣的扑克牌问题,即“统计54张扑克牌中有多少张黑桃牌”。
最直观的做法:自己在54张扑克牌中一张一张地检查并数出13张黑桃牌。
而MapReduce的做法及步骤如下:
(1)给在座的所有牌友(比如4个人)尽可能地平均分配这54张牌;
(2)让每个牌友数自己手中的牌有几张是黑桃牌,比如老张是3张,老李是5张,老王是1张,老蒋是4行,然后每个牌友把黑桃牌的数目分别汇报给你;
(3)你把所有牌友的黑桃牌数目加起来,得到最后的结论——一共13张黑桃牌。
这个例子告诉我们,MapReduce的两个主要功能是Map和Reduce。
(1)Map:把统计黑桃牌数目的任务分配给每个牌友分别计数。
(2)Reduce:每个牌友不需要把黑桃牌递给你,而是让他们把各自的黑桃牌数目告诉你。
我们还可以将问题细化:
(1)把牌分给多个牌友并且让他们同时各自计数,这就是并行计算。多个牌友在计数黑桃牌的过程中并不需要知道其他的其他的牌友在干什么,这就是分布式计算。
(2)MapReduce假设扑克牌是洗过的(Shuffled),且扑克牌分配得尽量均匀。如果所有黑桃牌都分到了一个玩家手上,那他数牌的过程可能比其他人要慢很多。
(3)如果牌友足够多的话,MapReduce还能够解决更有趣的问题,例如“54张扑克牌的平均值是多少(大、小王分别算0)”。MapReduce可以提炼成“所有扑克牌牌面的数值的和”及“一共有多少张扑克牌”这两个问题来解决。显然,用牌面的数值的和除以扑克牌的张数就得到了平均值。
MapReduce的工作机制远比我们举的小例子复杂得多,但是基本思想是类似的,即通过分散计算来分析海量数据。