本节书摘来华章计算机《Hadoop与大数据挖掘》一书中的第2章 ,第2.1.3节,张良均 樊 哲 位文超 刘名军 许国杰 周 龙 焦正升 著 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.1.3 Hadoop计算—MapReduce
MapReduce是Google提出的一个软件架构,用于大规模数据集(大于1TB)的并行运算。概念“Map(映射)”和“Reduce(归纳)”以及它们的主要思想,都是从函数式编程语言借来的,还有从矢量编程语言借来的特性。
当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组,如图2-6所示。
下面将以Hadoop的“Hello World”例程—单词计数来分析MapReduce的逻辑,如图2-7所示。一般的MapReduce程序会经过以下几个过程:输入(Input)、输入分片(Splitting)、Map阶段、Shuffle阶段、Reduce阶段、输出(Final result)。
1)输入就不用说了,数据一般放在HDFS上面就可以了,而且文件是被分块的。关于文件块和文件分片的关系,在输入分片中说明。
2)输入分片:在进行Map阶段之前,MapReduce框架会根据输入文件计算输入分片(split),每个输入分片会对应一个Map任务,输入分片往往和HDFS的块关系很密切。例如,HDFS的块的大小是128MB,如果我们输入两个文件,大小分别是27MB、129MB,那么27MB的文件会作为一个输入分片(不足128M会被当作一个分片),而129MB则是两个输入分片(129-128=1,不足128MB,所以1MB也会被当作一个输入分片),所以,一般来说,一个文件块会对应一个分片。如图2-7所示,Splitting对应下面的三个数据应该理解为三个分片。
3)Map阶段:这个阶段的处理逻辑其实就是程序员编写好的Map函数,因为一个分片对应一个Map任务,并且是对应一个文件块,所以这里其实是数据本地化的操作,也就是所谓的移动计算而不是移动数据。如图2-7所示,这里的操作其实就是把每句话进行分割,然后得到每个单词,再对每个单词进行映射,得到单词和1的键值对。
4)Shuffle阶段:这是“奇迹”发生的地方,MapReduce的核心其实就是Shuffle。那么Shuffle的原理呢?Shuffle就是将Map的输出进行整合,然后作为Reduce的输入发送给Reduce。简单理解就是把所有Map的输出按照键进行排序,并且把相对键的键值对整合到同一个组中。如图2-7所示,Bear、Car、Deer、River是排序的,并且Bear这个键有两个键值对。
5)Reduce阶段:与Map类似,这里也是用户编写程序的地方,可以针对分组后的键值对进行处理。如图2-7所示,针对同一个键Bear的所有值进行了一个加法操作,得到这样的键值对。
6)输出:Reduce的输出直接写入HDFS上,同样这个输出文件也是分块的。
说了这么多,其实MapReduce的本质用一张图可以完整地表现出来,如图2-8所示。
MapReduce的本质就是把一组键值对经过Map阶段映射成新的键值对;接着经过Shuffle/Sort阶段进行排序和“洗牌”,把键值对排序,同时把相同的键的值整合;最后经过Reduce阶段,把整合后的键值对组进行逻辑处理,输出到新的键值对。这样的一个过程,其实就是MapReduce的本质。
Hadoop MapReduce可以根据其使用的资源管理框架不同,而分为MR v1和YARN/MR v2版本,如图2-9所示。
在MR v1版本中,资源管理主要是Jobtracker和TaskTracker。Jobtracker主要负责:作业控制(作业分解和状态监控),主要是MR任务以及资源管理;而TaskTracker主要是调度Job的每一个子任务task;并且接收JobTracker的命令。
在YARN/MR v2版本中,YARN把JobTracker的工作分为两个部分:
1)ResourceManager(资源管理器)全局管理所有应用程序计算资源的分配。
2)ApplicationMaster负责相应的调度和协调。
NodeManager是每一台机器框架的代理,是执行应用程序的容器,监控应用程序的资源(CPU、内存、硬盘、网络)使用情况,并且向调度器汇报。