3.1.3 MapReduce计算框架

更新于 2026年10月10日 版权声明
3.1.3 MapReduce计算框架

MapReduce是Hadoop解决大规模数据分布式计算方案,既是一个编程模型,又是一个计算框架。开发人员必须基于MapReduce编程模型进行编程开发,然后将程序通过MapReduce计算框架分发到Hadoop集群中运行。也就是说,基于MapReduce框架编写的应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的、具有容错能力的方式并行处理上TB级别的海量数据集。

1)MapReduce编程模型

MapReduce是一种简单又非常强大的编程模型。简单在于其编程模型只包含Map和Reduce两个过程;强大在于不管是关系代数运算(SQL计算),还是矩阵运算(图计算),大数据领域几乎所有的计算需求都可以通过MapReduce编程来实现。

MapReduce分为Map和Reduce两个过程。Map的主要输入是一组<key1, value1>键值对,经过Map计算后输出一对<key2, value2>键值对,然后将相同key2合并,形成<key2, value集合>,再将这个<key2, value集合>输入Reduce,经过计算输出零个或多个<key3, value3>键值对。从Map过程可以看出,MapReduce只适合线性可并行的计算任务,子任务之间不能有依赖关系,只有这样的计算任务,才能进行拆分,然后通过Map并行计算,最终通过Reduce进行结果的叠加。MapReduce编程过程与食物汉堡的制作过程非常类似,其核心思想是:分而治之。Map过程是一个分片处理过程,就是将制作汉堡需要的食材进行分别加工处理的过程,可以并行加工面包片、黄瓜、青椒、西红柿等原始食材,形成汉堡所需的半成品食材。Reduce过程就是聚合的过程,把Map阶段加工好的半成品食材进行汇合处理,最后形成汉堡成品的过程,如图3⁃1所示。

图示

图3⁃1 MapReduce过程与汉堡制作类比图

假如有10 000张钞票,其中面值有1元、5元、10元、20元、50元和100元不等,共6种面值,这时需要计算出这10 000张钞票一共有多少钱,请问如何计算?

最直接的做法就是一张一张地数,然后相加,但是这样只能由一个人来操作,因此效率是非常低下的。比较好的做法就是先划分6个区域,每个区域块分别存放不同面值的钞票,分完块之后再计算出每堆钞票的数量,最后汇总相加得出结果,这样的做法最大的好处就是可以多人分工处理。而MapReduce正是采取的这种方式,先进入Map阶段,也就是先分片。假设把10 000张钞票一共分出5个进程来处理Map阶段的数据,那么就是每个进程处理2 000张钞票,处理完后,每个进程都会得出6个区域块。这时将这5个进程的区域块合并,就会得出总的6个区域块。然后进入Reduce阶段,Reduce也会采取多进程模式,假设分出6个进程来处理Reduce阶段的数据。每个进程处理一个区域块,这时就会得到6个区域块的结果,也就是6个面值的钞票分别有多少,最后将其汇总,得出结果。

从上面两个例子可以看出,MapReduce编程模型的核心就是Mapper和Reducer。

Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对于原任务要大大缩小。二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算。三是这些小任务可以并行计算,彼此间几乎没有依赖关系。

Reducer负责对Map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题进行设置,缺省值为1。

如果采用MapReduce思想来统计图书馆中的藏书量,那就是,你数1号书架,我数2号书架……这就是“Mapper”。参与人越多,统计就更快。把所有人的统计数加在一起,这就是“Reducer”。

MapReduce就是以这样一种可靠且容错的方式对大规模集群海量数据进行数据处理、数据挖掘、机器学习等方面的操作。

2)MapReduce计算框架

MapReduce框架是Hadoop平台根据MapReduce编程模型实现的计算框架,目前已经实现了两个版本:MapReduce 1.0和基于YARN结构的MapReduce 2.0。尽管MapReduce 1.0中存在一些问题,但是整体架构比较清晰,更适合初学者理解MapReduce的核心概念。

MapReduce 1.0的架构如图3⁃2所示,由JobClient(客户端)、JobTracker(作业跟踪器)、TaskTracker(任务跟踪器)和Task(任务)组成。

图示(https://www.daowen.com)

图3⁃2 MapReduce 1 .0架构

(1)JobClient

用户编写的MapReduce程序通过JobClient提交给JobTracker。

(2)JobTracker

JobTracker主要负责资源监控和作业调度,并且监控所有TaskTracker与作业的健康情况,一旦有失败情况发生,就会将相应的任务分配到其他结点上去执行。

(3)TaskTracker

TaskTraker会周期性地将本结点的资源使用情况和任务进度汇报给JobTracker,与此同时会接收JobTracker发送过来的命令并执行操作。

(4)Task

Task分为Map Task和Reduce Task两种,由TaskTracker启动,分别执行Map和Reduce任务。一般来讲,每个结点可以运行多个Map和Reduce任务。

MapReduce设计的一个核心理念就是“计算向数据靠拢”,而不是传统计算模式的“数据向计算靠拢”。这是因为移动大量数据需要的网络传输开销太大,同时也大大降低了数据处理的效率。所以,Hadoop的MapReduce框架和HDFS 是运行在一组相同的结点上的。这种配置允许框架在那些已经存好数据的结点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用,从而减少了结点间数据的移动。

如图3⁃3所示,Hadoop MapReduce框架由一个单独的JobTracker和每个集群结点都有的一个TaskTracker共同组成。JobTracker负责调度构成一个作业的所有任务,这些任务分布在不同的TaskTracker上,JobTracker监控它们的执行,并重新执行已经失败的任务。TaskTracker仅负责执行由JobTracker指派的任务。

图示

图3⁃3 Hadoop的MapReduce与HDFS集群架构

应用程序需要指定I/O的路径,并通过实现合适的接口或抽象类提供Map和Reduce函数,再加上其他作业参数,就构成了作业配置(Job Configuration)。

Hadoop的Client提交作业(如Jar包、可执行程序等)和配置信息给JobTracker,JobTracker负责分发这些作业和配置信息给TaskTracker,调度任务并监控它们的执行,同时提供状态和诊断信息给JobClient。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)