MapReduce思想的学习

       这学期教hadoop,发现在备课MapReduce思想的时候,查阅资料基本上所有博客都没有真正讲出MapReduce的思想,而只是把它的计算过程讲出来,甚至有些说法还是误人子弟的。所以我就一直在想如何能把MapReduce的思想讲得通俗易懂,发现确实很难能“讲”出来。好久没写文章,希望这篇博客能通过一些细节让大家感受这种处理方式的精华在哪。

       还是从主要能查阅的资料说起。其中我认为最接近讲到思想的两篇文章,第一篇是百科,里面确实囊括了各种说法,中间MapReduce的由来那段文字。它引述谷歌自己的说法: MapReduce的灵感来源于函数式语言(比如Lisp)中的内置函数map和reduce。然后"解释"了map和reduce这两个函数式编程方式和MapReduce框架是怎么关联起来的。读完你会发现,那个解释只是一种反向找到合理的解释而已,并没有正向解释是如何从map和reduce产生这种MapReduce,这才是MapReduce真正的思想。而真正的思想也只有谷歌自己轻描淡写了一下:因为谷歌团队里存在大量同类型的计算需求然后将它提取成框架。其实很多理论尤其是工程的都是从实践中沉淀下的精华中升华出来的,如果我们能体会他们发明MapReduce的过程,对我们自己的实践也极为有益。

       那如何描述MapReduce与map+reduce的关系,那就从wordcount说起吧,谷歌把它当作MapReduce的helloworld,虽然确实是个最现实的例子,但其实并不是最合适解释MapReduce的例子。最合适的例子我觉得是 第二篇博客 https://cloud.tencent.com/developer/news/52756  前面部分举得数扑克牌的例子:给你一叠扑克牌,你想数出每种花色各多少张。这个过程你自己完成也多半会分成两个步骤,首先把牌按花色分堆,然后每堆单独花色的牌数张数,这正是map和reduce的过程。

      1. map是什么意思? 映射函数(map)就是对一些独立元素组成的概念上的列表的每一个元素进行指定的操作(例如,map(f(x), [x1, x2, x3, x4] ) = [f(x1), f(x2), f(x3), f(x4)])。例子里第一步的 牌分4堆,就是对每张牌挑出它的花色,放进对应的堆里。

      2. reduce是什么意思?归约函数(reduce)指的是对一个列表的所有元素进行以一种"将上次结果和序列的下一个元素"进行计算的 操作(例如,reduce(f(x,y),  [x1,x2,x3,x4], init) =  f(x4, f(x3, f(x2, f(x1, init))))) init是初始值。例子里第二步的数牌,就是个不断累加的归约操作。

       所以要完成整个数牌任务,map和reduce之间靠的是“花色”这个概念连接,这也是整个问题核心。也就是我们想要用MapReduce来解决问题,也就是找到把map+reduce真正串联起来的这个概念,也就是key。 于是我们就有所有博客都会介绍的MapReduce流程。1. map的作用是,对所有数据的每条应用同一套逻辑:处理/标记出信息的key ;2. 由MapReduce框架帮你把那些相同key的数据整合在一起成为一个一个的 ; 3. reduce的作用是,对同一组的所有数据用一套逻辑,累积出这个组的结果。不失一般性,数据都能表示成<key, value>格式, 那么MapReduce计算过程就可以描述为

                    <k1,v1>   =>  map  =>  <k2, v2>   => shuffle =>  <k2, list<v2>>   => reduce  =>   <k4, v4>

其实可以发现其中map和reduce的计算过程都是可以并行的,shuffle是框架来完成的。也就是下图中map()和reduce()都可以同时进行的。



       那么为什么我说wordcount不是最合适的例子呢?这就要再思考一下Hadoop的MapReduce和真正map+reduce成的MapReduce有什么差异。wordcount中或者Hadoop版我们写的MR 其实是比严格的MapReduce逻辑要宽松的,这里还是有两点:1. map所用函数f,可以产生任意多的<key value> 对,2. reduce所用函数f,为了达到累积效果,可以灵活操作组内所有数据。第一点,wordcount的map操作严格说来,每条数据产生了一组<key,value>数据,这一组数据在我们看来是需要“拉平”的,准确的应该是flatMap,那flatMap和map的区别那就不是一两句话能说清了,大家可自行搜索,背后是有数学差异的,我们的MapReduce允许你实现超越原始map的能力。第二点,让你实现的reduce也不必每次计算都严格地按将上次结果和序列的下一个元素累积这么算,可以抽出列表自己玩,所以说Hadoop的MapReduce还是宽松不少。

       最后MapReduce作为一种分布式计算框架,其的精华何在呢?还是对比一下数牌的例子,如果不是自己一个人竖排,而是给你4个人做这件事,你会怎么做? 直观的办法就是每个人各取一部分扑克牌,数完四种花色,最后再汇集一次。另一种办法,每个人开始也是取一部分扑克牌,但过程是:根据花色不同牌递给不同的人(每个人收一种花色),当每个人挑完花色并收完所有别人给的牌以后,再数自己手里拿到的张数。仔细体会这两种办法的差别,第一种只是简单的任务拆分,看起来也有累加,但工序上并没有真正拆开(很多公司干活的人海战术法),而第二种,是真正的分工模式,同样是任务分配出去了,第二种才是MapReduce。所以MapReduce的精华我认为在于一种它是一种真正代表“分工”的方法论,我认同有人说MapReduce是分布式计算最伟大的发现。另外一个代表MapReduce思想的问题是:一切计算都能用MapReduce来表示。很遗憾我自己也没有找到证明,希望有人能告诉我。

      MapReduce作为一个有十多年历史的方法论,而现在也很少有人需要直接用它来编写算法,都是直接在更高级的算子上编程,比如hive、pig、spark。MapReduce过程理解起来并不难,但它是提供了一种更底层的数据处理思维,这对我们学习大数据十分有用。尤其是spark,你会发现它主打的DAG只是在MapReduce上进行了加强而已。MapReduce作为一种方法论,也不是万能的,不是所有任务都这么合适拆。我们学习MapReduce,就是要学到用它特定的分工策略用来解决某些实际问题的能力。最后回应我开篇说有些文章误人子弟说MapReduce采用的是“分而治之”的策略,其实是瞎说,“分治”是算法里面的概念跟这里的“分工”没有一丁点关系。

 

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值