1、MapReduce是什么?

Hadoop MapReduce是针对谷歌MapReduce的开源实现,运行在分布式文件系统HDFS上。MapReduce是一种并行编程模型,用于大规模数据集(大于1TB)的并行运算,可以大幅提高程序性能,实现高效的批量数据处理。MapReduce的核心思想就是“分而治之”,它把输入的数据集切分为若干独立的数据块,分发给一个主节点管理下的各个分节点来共同并行完成,最后,通过整合各个节点的中间结果得到最终结果。它将复杂的、运行于大规模集群上的并行计算过程高度抽象到两个函数——Map和Reduce,允许用户在不了解分布式系统底层细节的情况下开发并行应用程序,将其运行于廉价计算机集群上,完成海量数据的处理。

2、MapReduce的设计理念是什么?

MapReduce的设计理念是“计算向数据靠拢”,而不是“数据向计算靠拢”,移动计算要比移动数据更加经济。在一个集群中,只要有可能,MapReduce框架就会将Map程序就近地在HDFS数据所在的节点运行。

3、Map函数和Reduce函数的基本功能各是什么?

Map函数和Reduce函数都是以<key,value>作为输入,按一定的映射规则转换成另一个或一批<key,value>进行输出。

函数

输入

输出

说明

Map

<k1,v1>

List(<k2,v2>)

每一个输入的<k1,v1>会输出一批<k2,v2>,<k2,v2>是计算的中间结果。

Reduce

<k2,List(v2)>

<k3,v3>

List(v2)表示一批属于同一个k2的value

4、适合用MapReduce来处理的数据集需要满足什么前提条件?

待处理的数据集可以分解成许多小的数据集,而且每一个小数据集都可以完全并行地进行处理。

5、MapReduce的工作模型是怎样的?

请阐述MapReduce的基本设计思想_数据

 

一个大的MapReduce作业,首先会被拆分成许多个Map任务在多台机器上并行执行,每个Map任务通常都运行在数据存储节点上。当Map任务结束后,会生成以<key,value>形式表示的许多中间结果。这些中间结果会被分发到多个Reduce任务在多台机器上并行执行,具有相同key的<key,value>会被发送到同一个Reduce任务那里,Reduce任务会对中间结果进行汇总计算得到最后结果,并输出到分布式文件系统中。

6、MapReduce的工作特点是什么?

不同的Map任务之间不会进行通信,不同的Reduce任务之间也不会发生任何信息交换。用户不能显式地从一台机器向另一台机器发送消息,所有的数据交换都是通过MapReduce框架自身去实现的。Map任务的输入文件、Reduce任务的处理结果都是保存在分布式文件系统中的,而Map任务处理得到的中间结果则保存在本地存储中。只有当Map处理全部结束后,Reduce过程才能开始。只有Map需要考虑数据局部性,实现“计算向数据靠拢”,Reduce则无需考虑数据局部性。

补充问题:一个Map任务,能不能处理多个不同的<k1,v1>键值对?

一个Map任务是可以处理多个不同的<k1,v1>值的,并且对于每一个输入的<k1,v1>都会输出一批<k2,v2>。

 

1、MapReduce的具体执行阶段有哪些?

请阐述MapReduce的基本设计思想_请阐述MapReduce的基本设计思想_02

 

一个数据节点上可能有某个文件的多个数据块。

多个数据块可以分成多个数据分片,一个数据块也可以分成多个数据分片。

一个数据分片分配给一个Map任务进行处理。

一个数据节点上可以运行多个Map任务。

2、MapReduce的体系结构是怎样的?(PPT内容)

请阐述MapReduce的基本设计思想_大数据_03

 

MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker。

MapReduce体系结构主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task。

1)Client:用户编写的MapReduce程序通过Client提交到JobTracker端;用户可通过Client提供的一些接口查看作业运行状态。

2)JobTracker:JobTracker负责资源监控和作业调度。JobTracker监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点。JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而任务调度器会在资源出现空闲时,选择合适的任务去使用这些资源。

3)TaskTracker:TaskTracker会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等)。TaskTracker使用槽“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为Map slot和Reduce slot两种,分别供MapTask和Reduce Task使用。

4)Task:Task分为Map Task和Reduce Task两种,均由TaskTracker启动。

思考1:Map任务的数量,即谁来完成任务分配和数据分片,名称节点还是数据节点?

名称节点。

HDFS以固定大小的block为基本单位存取数据,而对于MapReduce而言,其处理单位是Split。Split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等,它的划分方法完全由用户自己决定。但大多数情况下,理想的分片大小是一个HDFS块。(下图的分片是有问题的,split1和split4的数据分片涵盖了两个数据节点,Map任务执行时需要移动数据。)

请阐述MapReduce的基本设计思想_数据集_04

 

思考2:Reduce任务的数量?

最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目。通常设置比reduce任务槽数目稍微小一些的Reduce任务个数,这样可以预留一些系统资源处理可能发生的错误。

思考3:一个数据节点上能否运行多个Reduce任务?

可以,但是一般不会这么分配。

3、Map端的Shuffle过程是怎样的?

 

请阐述MapReduce的基本设计思想_数据_05

请阐述MapReduce的基本设计思想_数据集_06

 

4、Reduce端的Shuffle过程是怎样的?

 

请阐述MapReduce的基本设计思想_大数据_07

请阐述MapReduce的基本设计思想_数据_08

 

5、MapReduce完整的Shuffle过程。

请阐述MapReduce的基本设计思想_大数据_09