Mapreduce:hadoop的计算框架
说到Mapreduce内容很多,就是总结一下大概的框架和运行过程。本来应该在写HDFS后就写Mapreduce的,它们两个是密不可分的。
mapreduce大概框架
Mapreduce是一个计算框架,既然是做计算的框架,那么表现形式就是有个输入(input),mapreduce操作这个输入(input),通过本身定义好的计算模型,得到一个输出(output),这个输出就是我们所需要的结果。
我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数和reduce函数。
数据->输入(input)->(k,v)->输出(output)->数据,这是最简单的线路,下面详细分析:
Mapreduce的运行机制
用实体来解释
首先介绍Mapreduce作业执行涉及的4个独立实体
1.客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
2.JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;
3.TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个(JobTracker只能有一个就和hdfs里namenode一样存在单点故障,我会在后面的mapreduce的相关问题里讲到这个问题的)
4.Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面
首先是客户端要编写好mapreduce程序,配置好mapreduce的作业也就是job,接下来就是提交job了,提交job是提交到JobTracker上的,这个时候JobTracker就会构建这个job,具体就是分配一个新的job任务的ID值,接下来它会做检查操作,这个检查就是确定输出目录是否存在,如果存在那么job就不能正常运行下去,JobTracker会抛出错误给客户端,接下来还要检查输入目录是否存在,如果不存在同样抛出错误,如果存在JobTracker会根据输入计算输入分片(Input Split),如果分片计算不出来也会抛出错误,至于输入分片我后面会做讲解的,这些都做好了JobTracker就会配置Job需要的资源了。分配好资源后,JobTracker就会初始化作业,初始化主要做的是将Job放入一个内部的队列,让配置好的作业调度器能调度到这个作业,作业调度器会初始化这个job,初始化就是创建一个正在运行的job对象(封装任务和记录信息),以便JobTracker跟踪job的状态和进程。初始化完毕后,作业调度器会获取输入分片信息(input split),每个分片创建一个map任务。接下来就是任务分配了,这个时候tasktracker会运行一个简单的循环机制定期发送心跳给jobtracker,心跳间隔是5秒,程序员可以配置这个时间,心跳就是jobtracker和tasktracker沟通的桥梁,通过心跳,jobtracker可以监控tasktracker是否存活,也可以获取tasktracker处理的状态和问题,同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。任务分配好后就是执行任务了。在任务执行时候jobtracker可以通过心跳机制监控tasktracker的状态和进度,同时也能计算出整个job的状态和进度,而tasktracker也可以本地监控自己的状态和进度。当jobtracker获得了最后一个完成指定任务的tasktracker操作成功的通知时候,jobtracker会把整个job状态置为成功,然后当客户端查询job运行状态时候(注意:这个是异步操作),客户端会查到job完成的通知的。如果job中途失败,mapreduce也会有相应机制处理,一般而言如果不是程序员程序本身有bug,mapreduce错误处理机制都能保证提交的job能正常完成。
这段话就解释图6,大概对着图6过一遍流程就懂了。
还有从另外一个角度回答这个问题,Mapreduce运行机制分为:输入分片(input split)、map阶段、combiner阶段、shuffle阶段和reduce阶段。
1.输入分片(input split):在进行map计算之前,mapreduce会根据输入文件计算输入分片(input split)
2.map阶段:就是程序员编写好的map函数了,因此map函数效率相对好控制,而且一般map操作都是本地化操作也就是在数据存储节点上进行
3.combiner阶段:combiner阶段是程序员可以选择的,combiner其实也是一种reduce操作
4.shuffle阶段:将map的输出作为reduce的输入的过程就是shuffle了
5.reduce阶段:和map函数一样也是程序员编写的,最终结果是存储在hdfs上的
看图2就很明显了,
图1
图2
图3
图4
图5
图6
以上的图全部看懂基本Mapreduce理解很深了。还有一些细节在b部分补充,例如:shuffe阶段,一些理论。如果图片太少的话,下面图片原文件。