YARN原理
一、YARN是什么
- 概述:yarn是一个资源调度平台,负责为运算的程序提供运算所需的资源,相当于一个分布式的操作系统,而MapReduce就相当于运行在操作系统上的一个应用程序。
- 来由:yarn是hadoop2.0加入的一个框架,用来取代hadoop1.0中的 JobTracker。
二、为什么要YARN
2.1 第一代Hadoop如何运行
- 组成:众所周知,yarn是hadoop2.0版本加入的。而hadoop1.0版本由分布式文件系统HDFS,分布式计算框架MapReduce组成。HDFS由一个NameNode和多个DataNode组成;MapReduce由一个JobTracker和多个TaskTracker组成。
- 运行:当client提交作业后,JobTracker会将作业加入队列并调度,默认调度规则是FIFO;TaskTracker会主动向JobTracker询问是否有任务可做(心跳机制),这个任务可以是map任务也可以是reduce任务;申请到任务后,TaskTracker会拷贝代码和任务信息到本地,并启动JVM运行;任务运行的过程中。首先将自己的状态汇报给TaskTracker,然后由TaskTracker告知JobTracker;JobTracker在接收最后一个任务完成后才算完成,并清理临时数据。
2.2 JobTracker的缺点
- 单点故障:与HDFS中的NameNode类似,JobTracker是集群事务的集中处理点,存在单点故障;
- 任务集中:JobTracker既要负责资源管理,又要负责作业调度,以及job和task的状态;
- 资源调度不周全(OOM):在TaskTracker端,用map/reduce task作为资源的表示过于简单,没有考虑CPU、内存等资源的情况;如果把两个需要消耗大内存的task调度到一起,就很容易出现OOM;
- 资源利用不足(slot):每个job申请资源以slot为单位。并且map task使用map slot,reduce task使用reduce slot,容易造成资源利用不足。
三、YARN的组成
3.1 ResourceManager
-
由来:yarn将 JobTracker的资源管理和作业控制功能分开,分别由ResourceManager和ApplicationMaster来实现。
-
组成:
-
调度器 Scheduler:负责给application分配资源,只是根据资源的使用情况进行调度;周期性的接收来自nodemanager的资源使用率的监控信息;调度方式有FIFO、Capacity Scheduler、 Fair Scheduler等,也可以自定义。
-
应用程序管理器 ApplicationsManager(AsM):负责处理client提交的job,以及协商第一个container,以供ApplicationMaster(AM)运行;管理系统中所有AM的生命周期,并在AM失败后重启AM。
-
-
作用:ResourceManager(RM)负责全局所有应用程序的资源分配。RM会跟踪集群中有多少活动的节点和资源,协调用户提交的那些应用程序(Job)应该在何时获取这些资源。RM是唯一拥有这些信息的进程。
-
高可用:RM与NameNode一样,也存在单点故障问题,但是目前还没有很好的实现,不过CDH4.4之后实现了一个简单的高可用,与NameNode的HA类似。
3.2 ApplicationMaster
-
作用:ApplicationMaster(AM)仅负责一个应用程序 (Job)内的所有任务的执行,包括监视任务、重启失败的任务等。AM可以在容器内运行任何类型的任务。例如MapReduce ApplicationMaster请求一容器来启动map和reduce任务,而Giraph AM请求一个容器来运行Giraph任务。也可以自定义。
-
中间人:AM负责向ResourceManager索要NodeManager执行任务所需的资源容器,起到中间人的作用;以及跟踪这些资源的使用情况,和任务进度的监控。
3.3 NodeManager
- 来由:NodeManager是TaskTracker的一种更加普通和高效的版本。没有固定数量的map/reduce slot,而是拥有许多动态创建的资源容器(Container)。
- 作用:NodeManager(NM)是客户端框架。负责Container,监控它们的资源使用并上报给RM;只会监视资源,不会监视任务;
- 资源本地化:在启动container时,NM会设置一些必要的环境变量,以及将container运行所需的jar包、文件等从HDFS下载到本地。
3.3.1 Container
- 作用:Container是yarn中对系统资源的抽象,同时它也是系统分配资源的基本单位;与MRv1中slot不同的是,container是一个动态的资源划分单位,其里边描述的CPU、内存等资源是根据实际应用程序的需求而变的,而slot是一个静态的资源抽象单位;Container是AM、Map/Reduce Task的运行容器。
四、YARN的运行过程
4.1 YARN可以运行的分布式应用程序:
- YARN的可扩展性:ResourceManager、NodeManager和Container都不关心应用程序的类型,所有特定于应用程序框架的代码都会转移到ApplicationMaster,以便任何分布式框架都可以受yarn支持。
- 可运行的应用程序:得益于YARN的可扩展性,Hadoop YARN集群可以运行许多不同类型的分布式分布式计算模型,例如:MapReduce、Giraph、Storm、Spark等。
4.2 运行过程(以MapReduce为例)
- 首先由driver向resourcemanager提交请求运行一个job的命令:job.waitForCompletion();
- RM同意后,返回给client一个jobid和存储切片、jar文件的位置;
- client根据返回的信息将切片和jar文件上传到hdfs的指定位置中,都是临时文件;
- drive申请一个容器,运行AM进程。RM同意后,生成容器任务,放进资源队列;
- 当任务开始执行时,创建任务容器,MRAppMaster加载任务信息;
- driver发送启动命令,运行程序,MRAppMaster接收命令,加载配置信息;
- 并向RM申请container运行mapTask;
- mapTask领到资源后,根据MRAppMaster加载的任务信息,下载jar包和切片,配置文件等;
- 运行mapTask;
- 当MapTask运行结束后,MRAppMaster向RM申请新的容器,运行reduceTask;
- reduceTask开始运行;
- 当所有的任务执行完毕后,MRAppMaster向RM注销本次job,并退出程序。
4.3 流程图
- 步骤1:用户向Yarn提交应用程序,其中包括用户程序、相关文件、启动ApplicationMaster命令、ApplicationMaster程序等。
- 步骤2:ResourceManager为该应用程序分配第一个Container,并且与Container所在的NodeManager通信,并且要求该NodeManager在这个Container中启动应用程序对应的ApplicationMaster。
- 步骤3:ApplicationMaster首先会向ResourceManager注册,这样用户才可以直接通过ResourceManager查看到应用程序的运行状态,然后它为准备为该应用程序的各个任务申请资源,并监控它们的运行状态直到运行结束,即重复后面4~7步骤。
- 步骤4:ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
- 步骤5:一旦ApplicationMaster申请到资源后,便会与申请到的Container所对应的NodeManager进行通信,并且要求它在该Container中启动任务。
- 步骤6:任务启动。NodeManager为要启动的任务配置好运行环境,包括环境变量、JAR包、二进制程序等,并且将启动命令写在一个脚本里,通过该脚本运行任务。
- 步骤7:各个任务通过RPC协议向其对应的ApplicationMaster汇报自己的运行状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以再任务运行失败时重启任务。
- 步骤8:应用程序运行完毕后,其对应的ApplicationMaster会向ResourceManager通信,要求注销和关闭自己。