详解MapReduce全过程

        写在开头:MapReduce应该是在我刚开始学习Hadoop和hive的时候就已经学习过的数据处理的过程,最近由于学到了spark,也是同样基于相同流程设计出的组件,觉得也是有必要进行一次流程上的梳理,以便自己可以更好的理解整个过程,更好的理解整个大数据框架数据处理的过程。

        总的来说,MapReduce的过程可以被分成两个部分,第一部分是map端,负责数据的处理,第二部分是reduce端,负责数据处理和计算,另外也常听到shuffle的部分,这一部分我认为是可以被涵盖在mapreduce之中的,所以我就并不展开来讲,而是放在最后进行总结。

以上是mapreduce流程图。

一、Map过程

        首先,需要读取hdfs中的数据,然后通过InputFormat类对数据进行切片。这里默认一个切片是128Mb,如果文件大小不到128Mb,那么会产生一个切片,大小就是文件本身的大小,多了也同理。一个block块对应一个切片。再通过RecordReader类将每个切片解析成一个个<k1,v1>。这个时候map端的前期准备工作就OK了,接下来就需要调用Map端的map()方法,这里的map方法可以由我们程序员自己进行实现以达到我们自己想要的需求。

        举个简单的例子,如果我们想实现一个聚合的操作,就可以自己定义map方法,实现的结果为<k2,v2>比如group by的字段,就可以用其作为k2,group by的结果作为v2,如此,是有非常多的想象空间的。由此,map端的前半部分工作就已经完成了。

        接下来就到了map部分后半部分的工作了

            map端前半段得到的<k2,v2>会被载入一个环形缓冲区,在这个缓冲区中,一旦内存达到百分之八十,就会开始溢写,然后被patition(分区)到不同的分区,接着就会进行字典排序,如果说map端给了一些combiner指令,那么在字典排序之后会进行这一步,如果没有,那么就应该直接合并成几个大的分区。接下来为了更快的读取速度,这些分区文件会被进行压缩然后进行磁盘IO加载到MapReduce中的Reduce端。至此,MapReduce的Map阶段的所有工作就已经完成了。

        这里也需要补充一点,这里的分区是如何进行的呢?我们可以思考,MapReduce过程的目的就是要对相同键的数据进行处理运算的,在这个计算过程中,我们需要保证的是相同的key最终会落到同一个分区中。因此,这里的分区原理是hash分区,这样就能够保证相同的键能够被分在同一个分区中了。

二、Reduce过程

        还记得map端结束的时候得到的那些数据们吗?Reduce端想使用他们。首先,reduce会通过http将数据读取,不同分区的数据读取到不同的Reduce节点,然后将这些分配到同一个reduce节点的数据进行重新合并,排序,分组。这样就得到了reduce方法所需要的数据。接着,我们程序员就可以按照我们自己的想法去处理一下我们的数据,比如说做sum,做average,或者取topN等等,都可以在这里进行实现。在实现结束后,Reduce端会将处理得到的结果写入到HDFS中,至此,整个的MapReduce过程就结束了。

三、shuffle过程

        我们在最开始的时候,买了一个关子,那就是mapreduce中的shuffle过程,这里我先来放一张整个shuffle过程的图

        我觉得聪明的同学应该很容易就看出来,所谓的shuffle过程,其实就是mapreduce整个流程的一个阶段,是能够被mapreduce整个过程所覆盖的,所以并没有必要进行单独列出一块进行讲解,整个shuffle的过程,其实就是数据从map端传输至reduce端的一个过程,在这个过程中,既需要用到磁盘IO,又需要通过http进行网络传输,所以这个过程所消耗的资源是巨大的,所以优化整个流程也是一个很不错的课题,在这里先简单列出两种方式,第一个就是对map端进行预聚合,第二个就是在MapShuffle分区合并之后进行压缩,减少网络传输量,感兴趣的同学们可以自己去了解了解哦。

四、案例分析

        下面,我们来用一个简单的WordCount来简单的回顾一下流程以便加深大家的印象

我们有两个文件,内容在图书上,因为是两个文件,文件又很小,所以就是被分成了两个切片,先通过InPutFormat类将文件进行读取变成kv格式,这里k就是偏移量,v就是要处理的数据,再将数据进行切分,这里看得出来,是按照空格进行切分的,并将切分后的每个单词赋予初始值1,由于我们预设了两个reduce任务所以就会分成两个区然后走到就是排序分组combine三件套,这里由于我们进行了自定义的combine,所以会有这个过程。接下来,map阶段结束,reduce将数据读取到不同的节点,再进行排序,分组,最终通过自定义的reduce方法来进行数据的最终处理然后传回hdfs。

五、总结

        我们为什么要如此大费周章的使用MapReduce?用MySQL处理不好吗?大家有没有这些疑问,明明很多的事情MySQL就能够解决的很好,为什么硬要上MapReduce呢?我来回答一下这个问题。

        MySQL是单机场景,而MapReduce是分布式系统,两个工具处理数据的能力是千差万别,mapreduce适合的是PB,TB级别的数据集处理,而mysql能力却较为有限。mapreduce采用分布式计算,容错性非常之高,一个节点报错了其他节点可以迅速进行补上。同时mapreduce的数据处理类型也非常的多样,图片,文档,日志都能够进行处理,非常厉害!mapreduce的作用和效果都很好,大家学习和深入了解他之后肯定会觉得既有趣又好用!

        最后,本文全原创,都是本人一个字一个字敲出来的,如果大家觉得有帮助,写的还不错,可以点个赞支持一下新人程序员哦,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值