MapReduce(三):MRAppMaster工作机制初探

作者: b91cbec6a902 | 来源:发表于2019-02-24 23:30 被阅读8次

    概述

    基于Hadoop 2.x

    MRAppMaster在整个MapReduce任务中负责管理整个任务的生命周期。它是一个独立的进程org.apache.hadoop.mapreduce.v2.app.MRAppMaster#main,由AppClient向Yarn申请Container后启动。
    MRAppMaster是MapReduce对ApplicationMaster的实现,它让MapReduce任务能运行在Yarn上。MRAppMaster主要职责包括将任务分解为MapTask和ReduceTask、为所有Task向Yarn申请Container资源、启动Container并在Task结束后释放Container等。

    MRAppMaster由哪些角色组成?

    Dispatcher:事件调度器,使用的实现类为AsyncDispatcher。可以向AsyncDispatcher注册事件处理器,它内部有一个阻塞队列用来存放所有事件,由一个线程来通过事件的类型来匹配事件处理器,最终将事件交给相应的事件处理器来处理。它是整个MRAppMaster的引擎。
    Job:代表整个MapReduce作业,使用的实现类为JobImpl。它内部有一个状态机,负责处理JobEventType类型的事件并改变Job的状态。
    Task:代表一个Map任务或Reduce任务,Map任务使用的实现类为MapTaskImpl,Reduce任务使用的实现类为ReduceTaskImpl。它内部有一个状态机,负责处理TaskEventType类型的事件并改变Task的状态。
    TaskAttempt:代表一次Task运行尝试,使用的实现类为TaskAttemptImpl,每个Task可能会有多次运行尝试。它内部有一个状态机,负责处理TaskAttemptEventType类型的事件并改变TaskAttempt的状态。
    ContainerAllocator:容器资源分配器。在非Uber作业中采用心跳的方式向Yarn申请Container,并将Container分配给Task。使用的具体实现为RMContainerAllocator,负责处理ContainerAllocator.EventType类型的事件。
    ContainerLauncher:容器启动器。负责准备Task启动的运行环境,并向NodeManager发送启动Container的命令。使用的具体实现为ContainerLauncherImpl,负责处理ContainerLauncher.EventType类型的事件。
    TaskAttemptListener:Task运行监听器。当Container启动后,Task就开始运行了,Task通过心跳的方式向TaskAttemptListener汇报自身的运行状况。
    Speculator:推测执行器。当一个MapReduce作业的某个Task运行速度明显慢于其他Task时,Speculator会为该Task启动一个备份Task,让它与原任务同时处理同一份数据,谁先计算完成则将谁的结果作为最终结果,并将另一个Task杀掉。该机制可有效防止那些“拖后腿”任务拖慢整个作业的执行进度。使用的具体实现为DefaultSpeculator,负责处理Speculator.EventType类型的事件。
    JobHistoryEventHandler:Job运行日志记录器。负责对作业的各个事件记录日志,比如作业创建、作业开始运行、Task开始运行等等,这些日志会被写到HDFS的某个目录下,这对于作业恢复非常有用。当MRAppMaster出现故障时,Yarn会将其重新调度到另外一个节点上。为了避免重新计算,MRAppMaster首先会从HDFS上读取上次运行产生的日志,以恢复已经运行完成的任务,进而能够只运行尚未运行完成的任务。同时用户还可以通过这些日志了解作业的运行状态。
    ClientService:MRAppMaster提供的客户端服务,AppClient可以通过该服务了解作业的运行状况和杀死作业。

    作为整个MRAppMaster的引擎,AsyncDispatcher的工作原理是怎样的?

    AsyncDispatcher内部有哪些主要成员?

    // org.apache.hadoop.yarn.event.AsyncDispatcher
    
    // 用来存放注册到AsyncDispatcher上的事件处理器,Key为事件类型,Value为事件处理器
    protected final Map<Class<? extends Enum>, EventHandler> eventDispatchers;
    
    // 阻塞队列,用来存放所有收集到的事件
    private final BlockingQueue<Event> eventQueue;
    
    // 事件处理器,职责就是收集事件,并将事件放入eventQueue中
    private final EventHandler handlerInstance = new GenericEventHandler();
    
    // 事件处理工作线程
    private Thread eventHandlingThread;
    

    eventDispatchers:用来存放注册到AsyncDispatcher上的事件处理器,Key为事件类型,Value为事件处理器。在MRAppMaster初始化的时候会将所有事件处理器注册到AsyncDispatcher中。
    eventQueue:阻塞队列,用来存放所有收集到的事件。
    handlerInstance:事件处理器,职责就是收集事件,并将事件放入eventQueue中。
    eventHandlingThread:事件处理工作线程,不断地从eventQueue中take事件来进行处理。所有事件串行处理。

    MRAppMaster在初始化的时候向AsyncDispatcher注册了哪些事件处理器?

    事件处理器

    MRAppMaster的工作流程是什么样的?

    整个作业的正常主流程如下:

    MRAppMaster的工作流程

    总结

    MRAppMaster在设计上采用事件驱动和状态机设计模式,各角色分工明确、职责清晰,实现的非常优雅,受益颇多。

    相关文章

      网友评论

        本文标题:MapReduce(三):MRAppMaster工作机制初探

        本文链接:https://www.haomeiwen.com/subject/dlvheqtx.html