分布式计算框架MapReduce

  • MapReduce简介
  • MapReduce计算模型
  • Map和Reduce函数
  • Shuffle机制


MapReduce简介

1.MapReduce是Hadoop生态中的一款分布式运算框架,它提供了非常完善的分布式架构,可以让不熟悉分布式计算的人员也能编写出优秀的分布式系统,因此可以让开发人员将精力专注到业务逻辑本身。
2.MapReduce采用“分而治之”的核心思想,可以先将一个大型任务拆分成若干个简单的子任务,然后将每个子任务交给一个独立的节点去处理。当所有节点的子任务都处理完毕后,再汇总所有子任务的处理结果,从而形成最终的结果。
3.MapReduce在发展史上经过一次重大改变,旧版MapReduce(MapReduce 1.0)采用的是典型的Master/Slave结构,Master表现为JobTracker进程,而Slave表现为TaskTracker。但是这种结果过于简单,例如Master的任务过于集中,并且存在单点故障等问题。因此,MapReduce进行了一次重要的升级,舍弃JobTracker和TaskTracker,而改用了ResourceManager进程负责处理资源,并且使用ApplicationMaster进程管理各个具体的应用,用NodeManager进程对各个节点的工作情况进行监听。升级后的MapReduce称为MapReduce 2.0,但也许由于“MapReduce”这个词已使用太久,有些参考资料中经常使用“MapReduce”来代指YARN。YARN的具体组成结构和各部分的作用,会在第5章中进行详细介绍。
4.如果要统计一个拥有海量单词的词库,就可以先将整个词库拆分成若干个小词库,然后将各个小词库发送给不同的节点去计算,当所有节点将分配给自己的小词库中的单词统计完毕后,再将各个节点的统计结果进行汇总,形成最终的统计结果。

MapReduce计算模型

1.MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。
2.MapReduce框架会为每个Map任务输入一个数据子集(split),Map任务生成的结果会继续作为Reduce任务的输入,最终由Reduce任务输出最后结果,并写入分布式文件系统。
3.编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算。

Map和Reduce函数

键值对:<key,value>
第一步:将数据抽象为键值对形式,接着map函数会以键值对作为输入,经过map函数的处理,产生一系列新的键值对作为中间结果输出到本地。
第二步:MapReduce框架自动将这些中间结果数据按照键做聚合处理,并将键相同的数据分发给reduce函数处理。
第三步:reduce函数以键和对应的值的集合作为输入,经过reduce函数处理后,产生另外一系列键值对作为最终输出。
{key1,value1}→{key2,List< value2>}→{key3,value3}

函数

输入

输出

说明

Map

<k1,v1>如:<行号,”a b c”>

List(<k2,v2>) 如:<“a”,1><“b”,1> <“c”,1>

1.将小数据集进一步解析成一批<key,value>对,输入Map函数中进行处理 2.每一个输入的<k1,v1>会输出一批<k2,v2>是计算的中间结果。

Reduce

<k2,List(v2)>如:<“a”,<1,1,1>>

<k3,v3> <“a”,3>

输入的中间结果<k2,List(v2)>中的List(v2)表示是一批属于同一个k2的value

Shuffle机制

1.Map阶段的产物会经过一个名为Shuffle的阶段。

Storm分布式框架 分布式框架原理_数据

2.在Shuffle阶段中进行排序、分区、合并操作,Shuffle阶段的产物是以“key=单词,value=出现次数的数组”形式输出。

Storm分布式框架 分布式框架原理_数据_02

3.首先,Shuffle会持续接收Map阶段发来的数据,并将数据写入到一个“环形缓冲区”中,当缓冲区被填满时就会将覆盖掉的部分数据溢出存放到“溢出文件”中。

Storm分布式框架 分布式框架原理_Storm分布式框架_03

4.其次,Shuffle会对溢出文件中的数据进行排序(Sort),然后再将排序后的数据进行分(Partition),例如,将字母A-字母K开头的放在0个分区,将字母L-字母Q开头的放在第1个分区……

5.同样Shuffle会生成很多个排序且分区后的溢出文件,最后,会将所有溢出文件中相同分区号的内容进行合并(Combine),形成本Map阶段最终的第0区内容、第1区……内容。

6.与此同时,其他Map阶段也会生成当前Map最终的第0区内容、第1区内容……最后Shuffle会对所有Map阶段相同分区号的内容再次进行合并,从而形成最终的第0区内容、第1区内容……最后不同区号中的内容就会发送到不同的Reduce中进行处理。