• mapreduce执行流程


    角色描述:
    JobClient:执行任务的客户端
    JobTracker:任务调度器
    TaskTracker:任务跟踪器
    Task:具体的任务(Map OR Reduce)

    从生命周期的角度来看,mapreduce流程大概经历这样几个阶段:初始化、分配、执行、反馈、成功与失败的后续处理

    每个阶段所做的事情大致如下

    任务初始化

    1.JobClient对数据源进行切片
    切片信息由InputSplit对象封装,接口定义如下:

    [java] view plaincopy
     
    1. public interface InputSplit extends Writable {  
    2.     long getLength() throws IOException;  
    3.     String[] getLocations() throws IOException;  
    4. }  

    可以看到split并不包含具体的数据信息,而只是包含数据的引用,map任务会根据引用地址去加载数据
    InputSplit是由InputFormat来负责创建的

    [java] view plaincopy
     
    1. public interface InputFormat<K, V> {  
    2.     InputSplit[] getSplits(JobConf job, int numSplits) throws IOException;  
    3.     RecordReader<K, V> getRecordReader(InputSplit split,JobConf job,Reporter reporter) throws IOException;  
    4. }  

    JobClient通过getSplits方法来计算切片信息,切片默认大小和HDFS的块大小相同(64M),这样有利于map任务的本地化执行,无需通过网络传递数据
    切片成功后,JobClient会将切片信息传送至JobTracker
    2.通过jobTracker生成jobId
        JobTracker.getNewJobId()
    3.检查输出目录和输入数据源是否存在
        输出目录已存在,系统抛出异常
        输入源目录不存在,系统抛出异常
    4.拷贝任务资源到jobTracker机器上(封装任务的jar包、集群配置文件、输入源切片信息)

    任务分配

    JobTracker遍历每一个InputSplit,根据其记录的引用地址选择距离最近的TaskTracker去执行,理想情况下切片信息就在TaskTracker的本地,这样节省了网络数据传输的时间
    JobTracker和TaskTracker之间是有心跳通信的逻辑的,通过彼此间不停的通信,JobTracker可以判断出哪些TaskTracker正在执行任务,哪些TaskTracker处于空闲状态,以此来合理分配任务

    任务执行

    TaskTracker接到任务后开始执行如下操作:
    1.将任务jar包从HDFS拷贝到本地并进行解压
    2.TaskTracker 为每个 Task 启动一个独立的 JVM 以避免不同 Task 在运行过程中相互影响



    如果所执行的任务是map任务,则处理流程大致如下:
    首先加载InputSplit记录的数据源切片,通过InputFormat的getRecordReader()方法
    获取到Reader后,执行如下操作:

    [java] view plaincopy
     
    1. K key = reader.createKey();  
    2. V value = reader.createValue();  
    3. while (reader.next(key, value)) {//遍历split中的每一条记录,执行map功能函数  
    4.     mapper.map(key, value, output, reporter);  
    5. }  

    执行反馈

    mapreduce的执行是一个漫长的过程,执行期间会将任务的进度反馈给用户
    任务结束后,控制台会打印Counter信息,方便用户以全局的视角来审查任务

    执行成功

    清理MapReduce本地存储(mapred.local.dir属性指定的目录)
    清理map任务的输出文件

    执行失败

    1.如果task出现问题(map或者reduce)
    错误可能原因:用户代码出现异常;任务超过mapred.task.timeout指定的时间依然没有返回
    错误处理:
    首先将错误信息写入日志
    然后jobtracker会调度其他tasktracker来重新执行次任务,如果失败次数超过4次(通过mapred.map.max.attempts和mapred.reduce.max.attempts属性来设置,默认为4),则job以失败告终
    如果系统不想以这种方式结束退出,而是想通过Task成功数的百分比来决定job是否通过,则可以指定如下两个属性
    mapred.max.map.failures.percent            map任务最大失败率
    mapred.max.reduce.failures.percent        reduce任务最大失败率
    如果失败比率超过指定的值,则job以失败告终

    2.如果是tasktracker出现问题
    判断问题的依据:和jobtracker不再心跳通信
    jobtracker将该tasktracker从资源池中移除,以后不在调度它

    3.jobtracker出现问题
    jobtracker作为系统的单点如果出现问题也是最为严重的问题,系统将处于瘫痪

  • 相关阅读:
    dubbo
    maven
    vue
    SSM框架整合
    MyBatis数据表注解开发
    MyBatis多表操作xml方式
    MyBatis映射配置文件
    Mybatis核心配置文件,传统开发和代理开发(主流)
    SpringMVC高级
    SpringMVC基础
  • 原文地址:https://www.cnblogs.com/bendantuohai/p/4766161.html
Copyright © 2020-2023  润新知