Hadoop学习笔记(5)———Mapreduce工作原理

时间:2022-12-27 07:43:46

Hadoop学习笔记(5)————Mapreduce工作原理Hadoop学习笔记(5)———Mapreduce工作原理 

一个MapReduce作业在hadoop上运行的整个过程可以分为4个实体:
(1)、客户端,提交MapReduce作业;
在客户端上使用runJob()方法来新建JobClient实例和调用它的submitJob()方法。提交作业后,runJob将每秒轮询作业的进度,如果发现与上一个记录不同,便把报告显示到控制台。作业完成后,如果成功,就显示作业计数器。否则,当之作业失败的错误会被记录到控制台。

JobClient的sunbmitJob()方法所实现的作业提交过程:
1、 向jobtracker请求一个新的作业ID(通过调用JobTracker的getNewJobId());
2、 检查作业的输出说明。比如,如果没有指定输出目录或者它已经存在,作业就不会被提交,并将错误放回给MapReduce程序;
3、 计算作业的输入划分。如果划分无法计算,比如因为输入路径不存在,作业就不会被提交,并有错误返回给MapReduce程序;
4、 将运行作业所需要的资源————包括作业JAR文件、配置文件和计算所得的输入划分————复制到一个以作业ID号命名的目录中jobtracker的文件系统。作业JAR的副本较多,如此以来,在tasktracker运行作业任务时,集群能为它们提供许多副本进行访问。

5、告诉jobtracker作业准备执行;



(2)、jobtracker协助作业的运行;


作业的初始化:
JobTracker接收到对submitJob()方法的调用后,会把此调用放入一个内部的队列中,交由作业调度器进行调度,并对其进行初始化。初始化包括创建一个代表该正在运行的作业的对象,它封装任务和记录信息,以便跟踪任务的状态和进程;
要创建运行任务列表,作业调度器首先从共享文件系统中获取JobClient己计算好的输入划分信息。然后为每个划分创建一个map任务。创建的reduce任务的数量由JobConf的mapred.reduce.tasks属性决定,它用serNumReduceTasks()方法来设置的,然后调度器便创建那么多reduce任务来运行。
任务分配:
TaskTracker执行一个简单的循环,定期发送心跳(heartbeat)方法调用Jobtracker。心跳方法告诉jobtracker,tasktracker是否还存活,同时也充当两者之间的消息通道。作为心跳方法调用的一部份,tasktracker会指明它是否已经准备运行新的任务,如果是,jobtracker会为它分配一个任务,并使用心跳方法的返回值与tasktracker进行通信;

(3)、tasktracker运行作业划分后的任务;
通过tasktracker本地化作业的JAR文件,将它从共享文件系统复制到tasktracker所在的文件系统。同时将应用程序所需要的全部文件从分布式缓存复制到本地磁盘;
为任务新建一个本地工作目录,并把JAR文件中的内容压缩到这个文件夹下;
新建一个TaskRunner实例来运行任务;

(4)、在以上所有过程的操作中,分布式文件系统(HDFS)被用来实现他们的作业文件的共享。

一个MapReduce作业失败有很多原因:

任务失败:1、子任务失败:map或reduce任务中的用户代码抛出运行异常,子任务JVM进程会在退出之前向其tasktracker父进程发送错误报告。错误报告最后被记入用户日志。tasktracker会将此次任务尝试标记为failed,释放一个槽以便运行另外一个任务;2、JVM突然退出:可能是JVM错误,由MapReduce用户代码某些特殊原因而造成JVM退出。3、任务的挂起:tasktracker注意到自己已经有一段时间没有收到进度更新,因此进而将任务标记为failed。在此之后子JVM进程将被自动杀死。


tasktracker失败如果某tasktracker由于崩溃或运行过于缓慢而失败,它将停止向jobtracker发送心跳。jobtracker会注意到此tasktracker已经停止发送心跳,会将它从等待任务调度的tasktracker池中移除。jobtracker会安排此tasktracker上已经运行并成功完成的map任务返回。如果它们属于未完成的作业的话,因为它们的中间输出都存放在故障tasktracker的本地文件系统上,这是reduce任务无法访问的,任何进行中的任务也都会被重新调度。

jobtracker失败



MapReduce的作业调度      FIFO算法(first In First Out),即所有的用户作业都被提交到一个队列中,然后由JobTracker按照作业的优先级(比如提交时间的先后顺序)选择将被执行的作业。该算法的具体实现是JobQueueTaskScheduler。具体而言,当一个tasktracker工作的游刃有余,期待获得新的任务的时候,JobQueueTaskScheduler会按照各个作业的优先级,从最高优先级的作业开始分配任务,选择任务的基本次序是:

                Map任务服务器的清理任务,用于清理相关的过期的文件和环境;
Map任务服务器的安装任务,负责配置好相关的环境;
Map Tasks
Reduce Clean Up Task
Reduce Setup Task
Reduce Tasks

转自: http://hi.baidu.com/jiangyangw3r/item/2d0810c1037aa657bdef6987  感谢作者