概述
基于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在设计上采用事件驱动和状态机设计模式,各角色分工明确、职责清晰,实现的非常优雅,受益颇多。
网友评论