首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【干货】解密MapReduce

我学习大数据有这样一个感悟:IT的智慧体现在算法上,而算法的灵感就来源于生活。什么意思,我们一起来看看MapReduce做离线计算到底是怎么一回事儿!要理解这个过程,我们先请出一个秘密武器:

大家都玩过扑克牌吧?没有玩过至少见过吧?现在有两幅扑克牌无序的堆成一摞放在桌子上。四个人玩牌,玩牌之前呢,他们要看看每一种花色的牌是否完整?请问大家,用什么方式最快?

——正确答案:把牌分成4摞,每个人拿一摞,拿到牌之后每个人把自己手里的牌按照红黑花梅的花色分堆,大家都分好之后再按照花色把四个人手中的牌整合到一起。红桃一摞,黑桃一摞,以此类推。到此为止,我们就已经成功的将两幅混乱的扑克牌按花色分成四摞了。然后呢,每个人去这四摞牌里面拿到一种花色,从最小排到最大,去清点自己手里的花色是否完整!

哈哈,其实这就是一个离线计算的过程。离线计算的过程分为两个阶段,首先是Map的阶段,就是我们最开始的时候把混乱的扑克牌分成4摞,每个人去拿一摞将其一张一张的分开的过程就是Map。分开之后,我们检查花色,并且按照花色将其分堆,这就是一个Partition的过程。

Partition完成之后呢?我们每个人的手上保存了4摞分好了花色的牌,这时候就进入了我们的Reduce阶段,进入Reduce阶段之后做些什么呢?首先要把每个人手里分好的牌按照花色整合到一起,然后再对整合好的每一摞牌进行检查。最后分别输出检查结果。我们具体拿一些数据来分析一下这个过程。

OK,看这里,input是我们要处理的数据,这是一个文本文档。我们需要做什么呢?我们把它送到MapReduce模块里边,需要得到如右边所示的结果。统计出来每个单词出现的词数。MapReduce怎么做呢?既然是集群模式,我肯定要把任务分配给不同的服务器对吧?假设我现在把文件分成3块(文件怎么划分呢?),文件分成几个块,就会在集群当中启动几个Map进程。每个进程拿到一块数据,接下来它会怎么做呢?

——正确答案:Map要对拿到的数据做一个处理,然后每个Map把处理结果交给Reduce,让Reduce去做一个统计,对吧?那么,Map先会将一行数据按空格键切分,变成若干个单词,然后单词每出现一次,计数为1,用一个键值对装起来。图片解析奉上~~~

计算好之后呢Map还要做一件事情,在数据量很多的情况下,我们一般还会让Map做一个单词的统计。因为如果不做单词统计的话,它就会把这一堆,,直接交给Reduce,所有Map的统计结果都要通过网络传输给特定的起Reduce进程的服务器,这样子的话会造成不同服务器之间数据传输的量很大。所以Map会把每一个单词出现了多少次统计出来,比如hello出现了1次,world出现了2次这样子。最后每一个Map都把自己手头的任务计算完毕了,就把结果存储起来,接下来就轮到Reduce上场啦!

在Map存储结果的过程当中,Reduce就会被启动,Reduce启动以后会去拿Map处理的结果,当有多个Reduce的时候,Reduce不会把全部的结果都读取回来,而是只读取属于自己的分区,即分区Partition。什么叫做分区呢?分区就是对Map计算的结果做的一个分类,有多少Reduce,我就把结果分成多少类,也就是多少个分区。这是通过一个算法来完成的,这个算法是怎么回事,我们后面会做一个细节补充。

我们先以4个Reduce为例(一般情况下Reduce的个数少于Map的个数),假设每一个不同的单词刚刚好对应一个不同的分区。那么Reduce拿到的数据就是我们图中所示的样子。Reduce对多个Map的计算结果做了一个整合,它还是一个一个的键值对,键是我们的单词,但是值呢变成了由每一个Map提交的计算结果组成的集合。Reduce要做的就是把这些集合里面的值加起来,得到最后的结果,也就是在整个文档里面,每个单词出现了多少次。

这样说起来是不是很简单呢?因为还有很多的细节我留在了中跟大家补充哦!大家是否对MapReduce的具体执行流程开始感兴趣啦?

欲知详情如何,请听下回分解!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181226A0ZO6X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券