MapReduce2.0是在Hadoop0.23开始采用的,叫做MapReduce2.0或者MRv2或者Yarn。
MRv2的主要思想是把jobtracker的任务分为两个基本的功能,一个是资源管理,一个是任务监控,这两个任务分别用不同的进程来运行。这个想法使拥有一个全局的资源管理器(ResourceManager)和每个应用程序的应用程序管理器(ApplicationMaster)。一个应用程序要么使用传统的MapReduce任务来运行,要么以DAG形式的任务来运行。
ResourceManager和每个节点(NodeManager)组成了处理数据的框架,ResourceManager是整个系统资源的最终决策者。实际上,每个应用程序的ApplicationMaster是框架具体的Lib,它的任务是从ResourceManager出获得资源,并在NodeManager上执行和监控任务。
ResourceManager有两个主要的组件:调度器(Schedule)和应用程序管理器(ApplicationManager)。
调度器(Schedule)负责分配资源到各种各样正在运行的应用程序中。调度器不执行监控和跟踪应用程序的状态,在这个意义上说,它是纯粹的调度器。此外,它也不保证重启失败的任务。调度器是基于资源的请求来执行它的调度功能的,它是基于资源容器的抽象概念的,这种资源容器包括内存、cpu、磁盘、网络等。在第一个版本中只支持内存。调度器支持可插入的策略,
ApplicationManager负责接送提交的作业,协商第一个执行该任务的容器,并提供失败作业的重启。
NodeManager是每个节点的框架代理。它负责监控资源的使用情况。并报告给ResourceManager.
每个应用的ApplicationMaster 负责与调度器谈判资源占用的containers数量,追踪状态和监控进程。
过程是:
客户端提交一个Application到Yarn Resource Manager,客户端通过ClientRMProtocol和ResourceManager通讯,首先通过getNewApplication请求,获得一个ApplicationId,之后便可以通过submitApplication提交Application。在调用submitApplication时,客户端需要向ResourceManager提供充足的信息,这些信息用于加载第一次运行该程序的container,the ApplicationMaster。程序需要提供的信息包括本地文件、jars包、执行时需要的命令,及Unix环境设计等。之后Yarn ResourceManager在已经分配的container中加载ApplicationMaster。之后ApplicationMaster通过AMRMProtocol和ResourceManager通信。首先,ApplicationMaster需要注册到ResourceManager中,为了完成分配给它的任务,ApplicationMaster之后便通过AMRMProtocol请求和接收containers,一旦一个container被分配给它,ApplicationMaster便和NodeManager通信,调用ContainerManager.startContainer去加载container。在加载container时,ApplicationMaster需要指定ContainerLaunchContext,ContainerLaunchContext和ApplicationSubmissionContext比较相似,它含有加载信息。当任务完成时,ApplicationMaster通过AMRMProtocol.finishApplicationMaster通知ResourceManager。
同时,客户端ResourceManager来监控Application的状态,或者直接通过ApplicationMaster来了解程序的状态。客户端也可以通过ClientRMProtocol.forceKillApplication来终止程序运行。