一 map Reduce原理:

 

执行过程:



1.客户端,提交MapReduce作业;



   a. 在客户端上使用runJob()方法来新建JobClient实例和调用它的submitJob()方法。



   b. 提交作业后,runJob将每秒轮询作业的进度,如果发现与上一个记录不同,便把报告显示到控制台。



   c. 作业完成后,如果成功,就显示作业计数器。否则,当之作业失败的错误会被记录到控制台。



2.JobClient的作业提交过程:



JobClient的sunbmitJob()方法,(通过调用JobTracker的getNewJobId());



JobClient的sunbmitJob()方法中,检查作业的输出说明。例如:如果没有指定输出目录或者它已经存在,作业就不会被提交,并将错误放回给MapReduce程序;



JobClient的sunbmitJob()方法中,计算作业的输入划分。例如:划分无法计算,比如因为输入路径不存在,作业就不会被提交,并有错误返回给MapReduce程序;



JobClient的sunbmitJob()方法中,将运行作业所需要的资源(包括作业JAR文件、配置文件和计算所得的输入划分)复制到一个以作业ID号命名的目录中jobtracker的文件系统。


JobClient的sunbmitJob()方法中,告诉jobtracker作业准备执行;

3.job Tracker 协助作业的运行

  作业的初始化:

JobTracker接收到对submitJob()方法的调用后,会把此调用放入一个内部的队列中,交由作业调度器进行调度,并对其进行初始化。

初始化包括创建一个代表该正在运行的作业的对象,它封装任务和记录信息,以便跟踪任务的状态和进程;
   要创建运行任务列表,作业调度器首先从共享文件系统中获取JobClient己计算好的输入划分信息。

   c. 然后为每个划分创建一个map任务。

创建的reduce任务的数量由JobConf的mapred.reduce.tasks属性决定,它用serNumReduceTasks()方法来设置的,然后调度器便创建那么多reduce任务来运行。

 任务的分配:

TaskTracker执行一个简单的循环,定期发送心跳(heartbeat)方法调用Jobtracker。

。心跳方法告诉jobtracker,tasktracker是否还存活,同时也充当两者之间的消息通道。作为心跳方法调用的一部份,tasktracker会指明它是否已经准备运行新的任务,如果是,jobtracker会为它分配一个任务,并使用心跳方法的返回值与tasktracker进行通信;

tasktracker运行作业划分后的任务

通过tasktracker本地化作业的JAR文件,将它从共享文件系统复制到tasktracker所在的文件系统。同时将应用程序所需要的全部文件从分布式缓存复制到本地磁盘;

   为任务新建一个本地工作目录,并把JAR文件中的内容压缩到这个文件夹下;

新建一个TaskRunner实例来运行任务;

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


任务失败原因:


子任务失败: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的作业调度:


该算法的具体实现是JobQueueTaskScheduler。

当一个tasktracker工作的游刃有余,期待获得新的任务的时候,

       JobQueueTaskScheduler会按照各个作业的优先级,从最高优先级的作业开始分配任务,选择任务的基本次序是:

       a.Map任务服务器的清理任务,用于清理相关的过期的文件和环境;
       b. Map任务服务器的安装任务,负责配置好相关的环境;

       c. Map Tasks
       d.Reduce Clean Up Task
       e. Reduce Setup Task
       f.Reduce Tasks