大数据学习之八——MapReduce工作机制

1.MapReduce的特点

软件框架、并行处理、可靠且容错、大规模集群、海量数据集

2.mapper和reducer

mapper负责“分”:把复杂的任务分解为若干个“简单的任务”来处理。简单的任务包含三层含义:

(1)数据或计算的规模相对原任务要大大缩小;

(2)就近计算原则,任务会分配到存放着所需数据的节点上进行计算;

(3)这些小任务可以并行计算,彼此间几乎没有依赖关系。

reducer负责对map阶段的结果进行汇总。

3.MapReduce的工作机制

(1)实体间的交互

如图所示,包含四个独立的实体

·客户端:编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;

·jobtracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行。jbotracker是一个java应用程序,它的主类是JobTracker

·tasktracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个。tasktracker是java应用程序,它的主类是TaskTracker

·HDFS文件式分布系统:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面。用来在其他实体间共享作业文件

MapReduce的运行步骤:

A. 首先是客户端要编写好mapreduce程序,配置好mapreduce的作业也就是job, 接下来提交job到JobTracker上,这个时候JobTracker就会构建这个job,具体就是分配一个新的job任务的ID值

B. 接下来jobtracker检查就是输出目录是否存在,如果存在那么job就不能正常运行下去,JobTracker会抛出错误给客户端;检查输入目录是否存在,如果不存在同样抛出错误.。如果存在JobTracker会根据输入,计算输入分片(Input Split),并配置Job需要的资源。

C. 分配好资源后,JobTracker初始化作业job,初始化主要做的是将Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,作业调度器会初始化这个job,初始化就是创建一个正在运行的job对象(封装任务和记录信息),以便JobTracker跟踪job的状态和进程。

D. 初始化完毕后,作业调度器会获取输入分片信息(input split),每个分片创建一个map任务。

E. 接下来进行任务分配,tasktracker会运行一个简单的循环机制定期发送心跳给jobtracker,心跳间隔是5秒,程序员可以配置这个时间,心跳就是jobtracker和tasktracker沟通的桥梁,通过心跳,jobtracker可以监控tasktracker是否存活,也可以获取tasktracker处理的状态和问题,同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。

F. 执行任务。在任务执行时候jobtracker可以通过心跳机制监控tasktracker的状态和进度,同时也能计算出整个job的状态和进度,而tasktracker也可以本地监控自己的状态和进度。当jobtracker获得了最后一个完成指定任务的tasktracker操作成功的通知时候,jobtracker会把整个job状态置为成功,然后当客户端查询job运行状态时候,客户端会查到job完成的通知。

(2)

在Hadoop中,一个MapReduce作业会把输入的数据集切分为若干独立的数据块,由Map任务以完全并行的方式处理;框架会对Map的输出先进行排序,然后把结果输入给Reduce任务;作业的输入和输出都会被存储在文件系统中,整个框架负责任务的调度和监控,以及重新执行已经关闭的任务;MapReduce框架和分布式文件系统是运行在一组相同的节点,计算节点和存储节点都是在一起的。

MapReduce作业的处理流程简略图:

按照时间顺序包括:输入分片(input split)、map阶段、combiner阶段和reduce阶段。

输入分片(input split):在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split),每个输入分片(input split)针对一个map任务。输入分片(input split)存储的并非数据本身,而是一个分片长度和一个记录数据的位置的数组,输入分片(input split)往往和hdfs的block(块)关系很密切;map阶段:程序员编写map函数,因此map函数效率相对好控制,而且一般map操作都是本地化操作也就是在数据存储节点上进行;Combiner阶段:是一个本地化的reduce操作,它是map运算的后续操作,主要是在map计算出中间文件前做一个简单的合并重复key值的操作;shuffle阶段:将map的输出作为reduce的输入的过程就是shuffle;reduce阶段:和map函数一样也是程序员编写的,最终结果是存储在hdfs上的。 

原文地址:https://www.cnblogs.com/m-study/p/8367067.html