美文网首页
MapReduce简明工作原理

MapReduce简明工作原理

作者: Moon_魔宽 | 来源:发表于2019-03-15 15:40 被阅读0次

版权声明:本文为博主原创文章,未经博主允许不得转载。https://www.jianshu.com/p/c5d217d46137

MapReduce被称为开启大数据算法之门的钥匙,本文对MapRduce的工作原理作一个简明的介绍。

MapReduce核心思想及框架

在古代,人们采伐下来很多木头,需要用马来拉,但如果木头很多的话,用一匹马拉则不现实,这时,找一匹更强壮的马来拉显然不是一个好的办法,而会选择让多匹马来拉;对于大数据来说,也是一样的原理,超级计算机并不是最可行的解决方案,分而治之才是最佳选择,这就是MapReduce的指导思想之一。

Hadoop 1.0版中的MapReduce计算框架(MRv1)被设计成Master/Slave(主/从)形式,如图所示,它主要包括四个部分,分别为JobTracker、TaskTracker、Client、Task。MRv1计算框架的基本思想是将问题抽象成两个阶段,Map和Reduce阶段。第一阶段也称为分解映射阶段,会先把输入数据分解为key/value键值对的形式,不断迭代,经过map函数调用处理过,然后仍以key/value键值对的形式输出到本地磁盘;第二阶段也称为合并规约阶段,会将映射阶段的输出结果按照相同key值的value合并在一起的方法进行处理,最后将归约结果输出到HDFS上。它的数据处理引擎包括两部分,Map Task和Reduce Task,前者完成Map阶段的逻辑处理,后者完成Reduce阶段的逻辑处理。运行时环境同样有两个,分别是JobTracker(一个)和TaskTracker(多个),JobTracker作为Master主节点,负责资源管理,并控制全部作业的分配,而TaskTracker作为Slave从节点,会在接收到主节点的命令后去执行相应的任务。该版本在容错性、扩展性和多框架支持方面存在着一定的缺陷,于是就有了MRv2的出现。

MRv1架构图

MRv2是在MRv1的基础上加以改进的产物,如图所示:

YARN架构图

它与MRv1的区别主要在于运行时环境不同,而编程模型、数据处理引擎则依然延续MRv1。新版本的MRv2不再由JobTracker和TaskTracker两部分组成,而采用了通用的资源管理系统YARN取代了JobTracker的角色,负责资源的管理和调度,同时作业的调度交由作业控制进程ApplicationMaster负责管理。简单来讲,MRv1只是个离线的计算框架,而MRv2则不同,它运行在通用资源管理系统上。

MapReduce执行流程

MapReduce的计算思想很简单,即把大量的输入数据集先进行划分,分解成若干个小的数据集,每一个(或多个)数据集再交由集群中的某个普通计算节点来运行,得到一个中间的输出结果,接着这些中间结果再根据一定的规则进行汇聚,归并出最后的输出结果到HDFS上,如图所示。

MapReduce处理流程(1)

从图中可以看出,MapReduce过程包括两个阶段,Map和Reduce,Map阶段框架会将用户输入分割成固定大小的片段,随后将每个片段进一步分解成一批键值对作为map函数的输入,并将得到的输出结果即新的键值对,根据其key值进行排序合并,然后再按照key值的范围采用一定的方法对键值对进行分组,对应不同的Reduce任务。

MapReduce处理流程(2)

Reduce阶段,Reduce任务把从不同Map端接收来的数据整合在一起并进行排序,然后执行用户自定义的reduce函数,得到最后结果输出到HDFS上。

MapReduce Shuffle过程

利用MapReduce计算框架实现并行计算,可大大地提升海量数据的运算性能。为了对MapReduce的性能作进一步的提升,仍有很多值得研究的地方。比如编写更加高效的map和reduce函数,或根据需要合理地设定系统的参数,如对map和reduce task数值的设定等,除了这些,MapReduce计算框架内部自身也存在优化空间,Shuffle过程作为其核心阶段,对它的优化和重构会对整体性能的提高产生重要的影响。

Shuffle(洗牌)是MapReduce最为关键的一个阶段,主要指的是从map按键排好序输出到reduce输入的整个传输过程,这个过程见证了奇迹的发生。具体来说,Shuffle跨越了map和reduce两个阶段。一般情况下,map操作和reduce操作都是在不同的节点上执行的,因为reduce端要对不同map端的结果进行汇聚归并,所以就要跨多个节点去拉取其上map操作的结果,如果系统上有很多在运行的作业,那么网络带宽将会成为一种非常稀缺的资源。

Shuffle包括2个阶段:map端中间结果的产生,并溢写保存到本地磁盘;拷贝中间结果,reduce端从多个map task节点上利用http协议远程拉取。下图为shuffle流程图。

MapReduce Shuffle过程

(1)Map端

1)首先从map 端开始分析。Map端通过调用 函数,对输入数据进行处理后,会产生若干个<key,value>键值对。

2)MapReduce编程模型根据一定的算法,利用partition接口实现对key值的分割(默认为哈希方法),并根据Reduce端的个数执行取模操作,这两步的操作决定了键值对的去向,即最终交由哪个reduce task进行后续处理。取模的目的是希望平衡Reduce端的处理负载,当算得数据对应的分区后,再根据map 输出的key值执行排序操作,可使最终溢出有分区的有序文件。然后对<key,value>键值对执行序列化操作,以字节数组的形式写入内存缓冲区。

3)溢写。Map 产生输出后,并不会直接将输出数据写入本地磁盘,因为这样的写入是非常频繁的,会对系统的性能造成很大影响。数据会被批量地存入到缓冲区之中,这是一个环形的缓冲区,是为了降低磁盘I/O对系统的影响。缓冲区的设计很巧妙,它的尾部写满后会从头部接着写,而此时头部的空间已经有部分溢写到本地磁盘,所以会形成类似环状的形态。缓冲区的默认大小是100M,当写入内容达到80M的时候,会对其锁定,启动溢写线程,将这80M内容以一个临时文件的方式存放本地磁盘上,同时map  task的输出还能继续往剩余的20M空间写入,互不影响。

4)merge过程。当Map端所有任务执行完成后,会输出生成若干个临时文件,此时要对磁盘中产生的所有临时文件做合并,以作为Map端最终的正式输出文件。然后每一个reduce task通过周期性地利用RPC(远程过程调用协议)与JobTracker进行通信得到map task的相关信息,然后符合要求的map task会通过http协议传输数据给相应的reduce task,此时Shuffle在Map端的流程结束。

(2)Reduce端

1)拷贝阶段。reduce task通过http协议,从执行完map 操作的TaskTracker上拷贝数据,然后将这些数据存放到内存缓冲区当中。与Map端相同,Reduce也存在一个内存缓冲区。若存入内存缓冲区中的数据超过了指定的阈值,或是超过了map端输出所指定的阈值(在Mapred.inmen.merge.threshold设置),则溢写入磁盘上。

2)Merge阶段。有3种方式可对从Map端传输来的数据进行汇聚归并。分别是硬盘到硬盘(disk to disk)、内存到硬盘(memory to disk)和内存到内存(memory to memory)。

3)合并过后,得到的便是Reduce端的输入文件,Shuffle的整个执行流程到此也就完成了。

WordCount示例

以最经典的wordcount为例,多个split文件最终的结果是文件的词频统计,如下图所示,我们来看它的流程具体是怎样实现的。

wordcount目标

首先,Map阶段框架会将用户输入分割成固定大小的片段,随后将每个片段进一步分解成一批键值对作为map函数的输入

map阶段

对分割结果执行map()方法:

对分割结果执行map()方法

map端会对<key,value>进行排序及Combine

Map端排序及Combine过程

Reduce端会根据Map端的结果进行排序,执行reduce()方法,输出结果。至此,mapreduce的wordcount完成。

Reduce端排序及输出结果

相关文章

网友评论

      本文标题:MapReduce简明工作原理

      本文链接:https://www.haomeiwen.com/subject/fixrmqtx.html