YARN 是 Hadoop 2.0 引入的统一资源管理和调度系统,也很具有代表性,目前 Spark on YARN 这种模式也在大量使用。
YARN 的架构是典型的主从架构,主节点是 ResourceManger,也是我们前面说的主调度器,所有的资源的空闲和使用情况都由 ResourceManager 管理。ResourceManager 也负责监控任务的执行,从节点是 NodeManager,主要负责管理 Container 生命周期,监控资源使用情况等 ,Container 是 YARN 的资源表示模型,Task 是计算框架的计算任务,会运行在 Container 中,ApplicationMaster 可以暂时认为是二级调度器,比较特殊的是它同样运行在 Container 中。
下图是YARN 启动一个 MapReduce 作业的流程
第 1 步:客户端向 ResourceManager 提交自己的应用,这里的应用就是指 MapReduce 作业。
第 2 步:ResourceManager 向 NodeManager 发出指令,为该应用启动第一个 Container,并在其中启动 ApplicationMaster。
第 3 步:ApplicationMaster 向 ResourceManager 注册。
第 4 步:ApplicationMaster 采用轮询的方式向 ResourceManager 的 YARN Scheduler 申领资源。
第 5 步:当 ApplicationMaster 申领到资源后(其实是获取到了空闲节点的信息),便会与对应 NodeManager 通信,请求启动计算任务。
第 6 步:NodeManager 会根据资源量大小、所需的运行环境,在 Container 中启动任务。
第 7 步:各个任务向 ApplicationMaster 汇报自己的状态和进度,以便让 ApplicationMaster 掌握各个任务的执行情况。
第 8 步:应用程序运行完成后,ApplicationMaster 向 ResourceManager 注销并关闭自己。
目前的宏观调度机制一共有 3 种:集中式调度器(Monolithic Scheduler)、双层调度器(Two-Level Scheduler)和状态共享调度器(Shared-State Scheduler),其中最常用的是双层调度模型
首先可以看到最下面的一个单词是 offers,还有蓝色和绿色的箭头方向,这说明什么问题呢?主调度器拥有整个集群资源的的状态,通过 Offer(主动提供,而不是被动请求)方式通知每个二级调度器有哪些可用的资源。每个二级调度器根据自己的需求决定是否占有提供的资源,决定占有后,该分区内的资源由二级调度器全权负责。
这句话怎么理解呢?如果你将集群资源看成一个整体,那么这种方式可以认为是预先将整个资源进行动态分区。作业则向二级调度器申请资源,可以多个作业共用一个二级调度器,此外,每个二级调度器和主调器都可以配置不同的调度算法模块。那么从这个点上来说,YARN 离真正的双层调度还有些差距,但和前面讲的 JobTracker 相比,已经是很大的进步了,并显著提升了调度性能,某度程度上,也可以说是一种双层调度,或者更准确地说,两次调度。所以如果在面试中,遇到这个问题,除非你和面试官都真的完全理解了 YARN 和双层调度的距离,否则还是回答 YARN 是双层调度吧。
和双层调度的距离,否则还是回答 YARN 是双层调度吧。
由于 Spark 与 MapReduce 相比,是一种 DAG 计算框架,包含一系列的计算任务,比较特殊,所以 Spark 自己实现了一个集中式调度器 Driver,用来调用作业内部的计算任务。申请到的资源可以看成是申请分区资源,在该分区内,所有资源由 Driver 全权使用,以客户端方式提交的 Spark on Yarn 这种方式可以看成是 Driver 首先在资源管理和调度系统中注册为框架调度器(二级调度器),接收到需要得资源后,再开始进行作业调度。那么这种方式可以认为是一种曲线救国的双层调度实现方式。