本文分析了Hadoop-0.23.0中一个Application从提交到运行结束的整个过程。期间涉及到Client,ResourceManage,NodeManager等组件以及RMClientProtocol,AMRMProtocol,ContainerManager等通信协议。
【注】 本文的两个主要图片可能不够清晰,可以从这里下载。
(上图参考了《Hadoop
0.23 MRv2分析》, 清晰版图片可从这里下载)
1. 涉及到的状态机
(1)RMApp:每个application对应一个RMApp对象,保存该application的各种信息。
(2)RMAppAttempt:每个RMApp可能会对应多个RMAppAttempt对象,这取决于前面的RMAppAttempt是否执行成功,如果不成功,会启动另外一个,直到运行成功。RMAppAttempt对象称为“application执行尝试”,这RMApp与RMAppAttempt关系类似于MapReduce中的task与taskAttempt的关系。
(3)RMNode:保存各个节点的信息。
(4)RMContainer:保存各个container的信息。
2. 事件调度器
(1)AsyncDispatcher
中央事件调度器,各个状态机的事件调度器会在中央事件调度器中注册,注册方式信息包括:<事件,事件调度器>。该调度器维护了一个事件队列,它会不断扫描整个队列,取出一个事件,检查事件类型,并交给相应的事件调度器处理。
(2)各个子事件调度器
事件类型 |
状态机 |
事件处理器 |
RMAppEvent |
RMApp |
ApplicationEventDispatcher |
RMAppAttemptEvent |
RMAppAttempt |
ApplicationAttemptEventDispatcher |
RMNodeEvent |
RMNode |
NodeEventDispatcher |
SchedulerEvent |
— |
SchedulerEventDispatcher |
AMLauncherEvent |
— |
ApplicationMasterLauncher |
3. ResourceManager中事件处理流
(1)Client通过RMClientProtocol协议向ResourceManager提交application。
<1> 代码所在目录:
hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-jobclient/src/main/java
<2> jar包:org.apache.hadoop.mapred
<3>关键类与关键函数:YARNRunner.submitJob()
(2) ResourceManager端的ClientRMService服务接收到application,使得RMAppManager调用handle函数处理RMAppManagerSubmitEvent事件,处理逻辑如下:为该application创建RMAppImpl对象,保存其信息,接着产生RMAppEventType.START事件.
<1> 代码所在目录:
hadoop-mapreduce-project\hadoop-yarn\hadoop-yarn-server\hadoop-yarn-server-resourcemanager\src\main\java\org\apache\hadoop\yarn\server\resourcemanager
<2> jar包:org.apache.hadoop.yarn.server.resourcemanager
<3>关键类与关键函数:ClientRMService.submitApplication(),RMAppManager.submitApplication()
(3) RMAppEventType.START事件传递给AsyncDispatcher,AsyncDispatcher查看相关数据结构,确定该事件由ApplicationEventDispatcher处理,该dispatcher将RMApp从RMAppState.NEW状态变为RMAppState.SUBMITTED状态,同时创建RMAppAttemptImpl对象,并触发RMAppAttemptEventType.START事件。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp
<2> 关键类与关键函数:RMAppImpl.StartAppAttemptTransition
(4)RMAppAttemptEventType.START事件传递给AsyncDispatcher,AsyncDispatcher查看相关数据结构,确定该事件由ApplicationAttemptEventDispatcher处理,该dispatcher将RMAppAttempt从RMAppAttemptState.NEW变为RMAppAttemptState.SUBMITTED状态。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt
<2> 关键类与关键函数:RMAppAttemptImpl.StateMachineFactory
(5) RMAppAttempt向ApplicationMasterService注册,它将之保存在responseMap中。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt
<2> 关键类与关键函数:RMAppAttemptImpl.AttemptStartedTransition
(6)RMAppAttempt触发AppAddedSchedulerEvent
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt
<2> 关键类与关键函数:RMAppAttemptImpl.AttemptStartedTransition
(7)ResourceScheduler(如FifoScheduler)捕获AppAddedSchedulerEvent事件,并创建SchedulerApp对象,使RMAppAttempt对像从RMAppAttemptState.SUBMITTED转化为RMAppAttemptState.SCHEDULED状态,同时产生RMAppAttemptEventType.APP_ACCEPTED事件。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo
<2> 关键类与关键函数:FifoScheduler.addApplication
(8)RMAppAttemptEventType.APP_ACCEPTED事件由ApplicationAttemptEventDispatcher捕获,并将RMAppAttempt从RMAppAttemptState.SUBMITTED转化为 RMAppAttemptState.SCHEDULED状态,并产生RMAppEventType.APP_ACCEPTED事件。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt
<2> 关键类:RMAppAttemptImpl.ScheduleTransition
(9)调用ResourceScheduler的allocate函数,为ApplicationMaster申请一个container。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt
<2> 关键类:RMAppAttemptImpl.ScheduleTransition
(10)此刻,某个node(称为“AM-NODE”)正好通过heartbeat向ResourceManager.ResourceTrackerService汇报自己所在节点的资源使用情况。
(11) ResourceTrackerService.nodeHeartbeat收到heartbeat信息后,触发RMNodeStatusEvent(RMNodeEventType.STATUS_UPDATE)事件。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager
<2> 关键类:ResourceTrackerService.nodeHeartbeat
(12) RMNodeStatusEvent被ResourceScheduler捕获,调用assginContainers为该application分配一个container(用对象RMContainer表示),分配之后,会触发一个RMContainerEventType.START事件。
(13) RMContainerEventType.START事件被NodeEventDispatcher捕获,使得RMContainer对象从RMContainerState.NEW状态转变为RMContainerState.ALLOCATED状态,同时触发RMAppAttemptContainerAllocatedEvent(RMAppAttemptEventType.CONTAINER_ALLOCATED)事件.
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.rmcontainer
<2> 关键类:RMContainerImpl.ContainerStartedTransition
(14) RMAppAttemptContainerAllocatedEvent事件被 ApplicationAttemptEventDispatcher捕获,并将RMAppAttempt对象从RMAppAttemptState.SCHEDULED状态转变为RMAppAttemptState.ALLOCATED状态,同时调用Scheduler的allocate函数申请一个container,并触发AMLauncherEventType.LAUNCH事件
(15)AMLauncherEventType.LAUNCH事件被ApplicationMasterLauncher捕获,主要处理逻辑如下:创建一个AMLauncher对象,并添加到队列masterEvents中,等待处理;一旦被处理,会调用AMLauncher.launch()函数,该函数会调用ContainerManager.startContainer()函数创建container,同时触发RMAppAttemptEventType.LAUNCHED事件。
<1> jar包:org.apache.hadoop.yarn.server.resourcemanager.amlauncher
<2> 关键类:ApplicationMasterLauncher
(16) RMAppAttemptEventType.LAUNCHED事件被ApplicationAttemptEventDispatcher捕获,并将RMAppAttempt对象从RMAppAttemptState.ALLOCATED状态转变为RMAppAttemptState.LAUNCHED状态。
(17)将该application的RMAppAttempt对象注册到AMLivenessMonitor中,以便实时监控该application的存活状态。
(18)AM-NODE节点为该Application创建ApplicationMaster,接下来ApplicationMaster会与ResourceManager协商资源并通知NodeManager创建Container。ApplicationMaster首先会向ApplicationMasterService注册。
(19)ApplicationMasterService收到新的ApplicationMaster注册请求后,会触发RMAppAttemptRegistrationEvent(RMAppAttemptEventType.REGISTERED)事件。
(20)RMAppAttemptRegistrationEvent事件被 ApplicationAttemptEventDispatcher捕获,并将RMAppAttempt对象从RMAppAttemptState.LAUNCHED状态转化为RMAppAttemptState.RUNNING状态,同时触发RMAppEventType.ATTEMPT_REGISTERED事件。
(21)至此,该application的ApplicationMaster创建与注册完毕,接下来ApplicationMaster会根据Application的资源需求向ResourceManager请求资源,同时监控各个子任务的执行情况。
4. ResourceManager中事件处理流直观图
下图是从另一个方面对上图的重新绘制:
分享到:
相关推荐
这部分内容详细讲述了YARN的核心组件,包括ResourceManager(资源管理器)、ApplicationMaster(应用主节点)和NodeManager(节点管理器)。此外,还介绍了YARN的调度策略,如FIFO、公平调度器和容量调度器。文章还...
- **MapReduce v2 (MRv2):** 作为 YARN 的一部分,支持新的 API,提高了灵活性和性能。 **2. MapReduce v1 与 MapReduce v2 的对比:** - **API 变更:** MRv2 提供了新的 API,允许开发者编写更复杂的应用程序。 ...
MRV2,也称为YARN(Yet Another Resource Negotiator),是Hadoop 2.x引入的新一代MapReduce框架,旨在提高资源管理和应用程序的灵活性。在MRV2中,MapReduce任务被分解为两个独立的组件:ApplicationMaster和...
2. **NodeManager (NM)**:每个节点上的NM是YARN的基础执行单元,它管理该节点的资源,响应来自ResourceManager的命令,以及ApplicationMaster的命令,如启动或停止容器。 3. **ApplicationMaster (AM)**:每个应用...
为了解决这些问题,Hadoop 2.0版本引入了一种新的资源管理系统YARN,即MRv2。YARN是一种通用的资源调度体系,它支持多种计算框架(如MapReduce、Spark、Storm等),让它们能够在同一个集群上运行。YARN的核心是资源...
YARN/MRv2架构中,ResourceManager负责全局资源管理和调度,而ApplicationMaster专注于任务调度和监视。此外,NodeManager在每个节点上管理任务执行,Container则作为资源分配的基本单位,考虑了CPU和内存等资源的...
- **MRv2**: YARN的容错机制更为健壮,因为ResourceManager和ApplicationMaster可以独立恢复,即使某个节点失败,作业也能继续进行。 5. **性能优化** - **MRv1**: MRv1中,Shuffle阶段的数据传输效率较低,且...
在Hadoop 2.x版本中引入,YARN的目标是解决原MapReduce框架(MRv1)的不足,提高集群资源的利用率和整体性能。YARN通过将资源管理和任务调度功能分离,实现了更高效、灵活的集群资源分配。 【原MapReduce框架的不足...
YARN(Yet Another Resource Negotiator)是 Hadoop 2.0 中的资源管理系统,它的设计思想是将 MRv1 中的 JobTracker 拆分成两个独立的服务:一个全局的资源管理器 ResourceManager 和每个应用程序持有的 ...
YARN主要分为三个核心组件:资源管理器(ResourceManager)、节点管理器(NodeManager)和应用程序历史服务器(ApplicationHistoryServer)。其中,资源管理器负责整个系统的资源管理和任务调度,它允许不同应用程序...
在大数据处理中,除了Hadoop MapReduce(MRv2)外,还有其他计算框架如Storm(实时流处理)、Spark(内存计算)和Impala(快速查询)。这些框架各有优势,如Spark通过内存计算大幅提高处理速度,而Impala利用自己的...
3. **MapReduce改进**:新的MapReduce框架(MRv2)与YARN紧密集成,使得任务调度更加高效,同时引入了Container概念,封装了执行环境,减少了资源浪费。 4. **故障恢复与容错机制**:Hadoop 2.0.4增强了故障检测和...
YARN(MRv2)是 Hadoop 的新架构,旨在解决 MRv1 的问题。YARN 采用了一种分层的集群框架方法,将特定于 MapReduce 的功能已替换为一组新的守护程序,将该框架向新的处理模型开放。 YARN 的新架构 YARN 的新架构...
Hadoop 体系架构 Hadoop 体系架构是大数据处理的核心组件之一。...YARN 是 Hadoop 的新架构,旨在解决 MRv1 的问题,提供了一种分层的集群框架方法,能够支持 MRv2 和其他使用不同处理模型的应用程序。
此外,`yarn.nodemanager.aux-services`用于设置MapReduce所需的辅助服务,如MRv2 shuffle service。 `hdfs-site.xml`是HDFS(Hadoop Distributed File System)的配置文件,它定义了HDFS的行为,如副本数量、块...
5. **Hadoop MRv1 (MapReduce v1)**: 虽然MRv2是主流,但为了向后兼容,Hadoop 2.7.6仍然保留了MRv1的源代码,用户可以根据需求选择使用。 6. **Hadoop Ozone**: Ozone是Hadoop的分布式对象存储系统,旨在提供低...
最后,对于MapReduce本身的单点故障问题,Hadoop 2.0引入了两种MapReduce实现:MRv1和MRv2(又称YARN上的MapReduce)。在MRv1中,JobTracker是单点故障,但在MRv2中,JobTracker被替换为ApplicationMaster,每个应用...
YARN是Hadoop2.0中的资源管理系统,它的设计思想是将MRv1中的JobTracker拆分成两个独立的服务:一个全局的资源管理器ResourceManager和每个应用程序持有的ApplicationMaster。其中RM负责整个系统的资源管理和分配,...