YARN(Yet Another Resource Negotiation) 是 Hadoop 的集群资源管理系统
在 Hadoop 2 中被引入,用于改善 MapReduce 的实现
但其具有足够的通用性,同样可以支持其他的分布式计算模式
YARN 通过两类长期运行的守护进程提供自己的核心服务
-
ResourceManager(RM) :管理集群上资源使用的资源管理器
-
NodeManager(NM) :运行在集群中所有节点上且能够启动和监控容器(Container)的节点管理器
- 负责该节点的程序的正常运行,定时向RM汇报本节点资源的使用情况和 Container 的运行状况
容器(Container) 用于执行特定应用程序的进程,每个容器都有任务运行所需的资源(内存、磁盘、CPU等)和环境(启动命令,环境变量等)
AppilicationManager(AM) 负责每一个具体应用程序的调度与协调
运行流程
- 客户端向集群提交一个任务,该任务首先到 RM 中的 AM
- AM 收到任务后,会在集群中找一个 NM,在该 NM 上启动一个 AppMaster进程,该进程用于执行任务和任务监控
- AppMaster 开始运行,向 RM 中的 AM 注册信息,AppMaster 向 RM 下的 ResourceSchedule 申请计算任务所需的资源
- AppMaster 申请到资源后,与所有 NM 通信,要求他们启动所有计算任务
- 每个 NM 启动对应的容器执行计算任务
- 各个任务会向 AppMaster 汇报自己的执行进度和状况,以便让 AppMaster 随时掌握各个任务的运行状态,在某个任务出现问题之后可以重新执行该任务
- 各任务执行完毕后,AppMaster 向 AM 汇报,以便让 AM 注销并关闭该 AppMaster,释放资源
YARN本身不会为应用的各部分间的通信提供任何手段,通信机制都是专属于各应用的
调度
YARN中有三种调度器:
-
FIFO调度器:将应用放置在一个队列中,先进先出逐个运行应用,特点是
- 简单易懂,不需要任何配置
- 不适合共享集群,大型应用会占用集群中所有资源,排在后面的应用会饥饿
-
容量调度器:允许多个组织共享整个集群,为每个组织分配专门的队列,每个队列被配置为可以使用一定的集群资源
- 队列可以进一步按层次划分,这样每个组织内的不同用户能够共享该组织队列所分配的资源
- 在一个队列内,按照FIFO调度策略对应用进行调度
- 作业在容量调度器下,一般来说只能获得被分配的资源(即使其它队列空闲),所以相比于FIFO调度器,作业执行的时间要长
- 但是在一个队列中有多个作业,且队列资源不够用了,若其他队列仍有可用的空闲资源,那么容量调度器可能会将空余的资源分配给队列中的作业,此谓弹性队列
-
公平调度器:不需要预留一定量的资源,因为调度器会在所有运行的作业之间动态平衡资源
-
第一个作业启动时,若是当前唯一运行的作业,可以获得集群中所有的资源
-
第二个作业启动时,两个作业五五开共享集群
-
从第二个作业的启动到获得公平共享资源之间会有时间滞后,因为它必须等待第一个作业使用的一些容器用完并释放出资源
-
当小作业结束,且不再申请资源后,还在执行的大作业将回去再次使用小作业释放的集群资源
-
效果:既得到了较高的集群利用率,又能保证小作业能及时完成
-
公平调度器也可以在多个队列间工作,在各自的队列里实现公平(每个队列平分集群资源,队列中的每个任务平分队列资源)
-
抢占:公平调度器支持抢占功能
- 背景:在一个繁忙的集群中,当作业被提交给一个空队列时,作业不会立刻启动,直到集群上已经运行的作业释放了资源
- 抢占,即允许调度器终止那些占用资源超过了其公平共享份额的队列的容器,这些容器资源释放后可以分配给资源数量低于应得份额的队列
- 抢占会降低整个集群的效率,因为被终止的容器需要重新执行
- 若队列在 minimum share preemption timeout 指定的时间内未获得被承诺的最小共享资源,调度器就会抢占其他容器
- 若队列在 fair share preemption timeout 指定的时间内获得的资源仍然低于其公平共享份额的一半,调度器就会抢占其他容器(见《Hadoop权威指南》93页)
-