1.简述
Yarn是Hadoop2.X的核心组件之一.负责集群的资源管理.(不局限于Hadoop,Spark等等相当多的组件都可以利用Yarn来进行资源管理与调度)
Yarn本身由两大组件构成:ResourceManager(RM)和NodeManager(NM).在Yarn中,整个资源管理依靠这两大组件来共同完成.
ResourceManager:
ResourceManager负责整个集群的资源管理与分配.它本身再由两个组件构成
应用程序管理器ApplicationManager
ApplicationManager是RM的中心入口,负责管理整个集群的应用程序.包括应用程序的提交,与调度器协商资源,跟踪分配的Container,启动AppMaster,监控AppMaster执行状态,失败重启等等
调度器(Scheduler)
调度器根据根据队列,容量等等条件(比如每队最多分配多少,最多执行作业数多少),总体上将系统中的资源分配给各个应用程序.
对于某一个应用程序,根据对该应用程序的请求进行资源分配.
资源分配的最终结果是一个Container.
NodeManager
NodeManager是每个节点上的资源管理器和任务管理器.它会定时向RM汇报本节点的资源情况和各个Container的运行状态,并接收和实际处理来自ApplicationManager的Container启动&暂停命令
2.核心概念
2.1 Container与资源隔离
Container,意义就像它的名字-容器.它是Yarn中对资源的一种抽象.它封装的是某个节点的多维度资源(内存,CPU,磁盘,网络等等),也是资源最终分配的结果与单位,
Container作为容器的另一个概念就是资源隔离.
资源隔离包含两层含义,即
Container之内的运行使用资源的上限不会超过Container,
Container之外的运行不会占用到Container之内的资源.
Container资源隔离的实际操纵者,是Yarn的NM.它针对不同的资源,可以使用不同的隔离机制.具体见后
2.2 ApplicationMaster
ApplicationMaster是一种应用框架,这是Yarn跨越Hadoop可以作为很多框架的资源调度组件的基础.
ApplicationMaster可以是任何编程语言编写的程序,它使用ProtocolBuf和ResourceManager.NodeManager进行交互.
它实际负责向ResourceManager申请协调资源,并且与NodeManager协同工作完成对任务的执行,监控等等(跟踪应用程序状态重启失败任务).
它的原生支持就是MR,但比如Spark,Storm等等很多都实现了自己的ApplicationMaster,所以才可以譬如SparkOnYarn.
3.Yarn的工作流程
1.向Yarn提交一个应用程序.(这个应用程序本身就会包含几个部分:用户程序,ApplicationMaster程序,以及启动ApplicationMaster的命令等)
2.ResourceManager将会为这个应用程序分配第一个Container.并且会立即与这个Container所在的NodeManager通讯,要求以这个Container启动ApplicationMaster应用程序
3.ApplicationMaster被启动后,会首先向ResourceManager注册,这个时候应用程序已经正式启动,可以通过ResourceManager查看应用程序状态了.
之后ApplicationMaster将接管应用程序,负责与ResourceManager通讯为之后的各个任务申请资源,监控状态,重复以下4-7步骤直到整个任务结束
4.ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请资源
5.一旦申请到资源拿到Container,ApplicationMaster将会立即与Container所在的NodeManager通讯,要求它启动任务
6.NodeManager为任务设置好运行环境(包括环境变量,Jar包,二进制程序等等),将任务启动写到一个脚本里,然后执行脚本启动任务
7.各个任务通过RPC协议向ApplicationMaster汇报自己的状态和进度,以便ApplicationMaster随时重启某个任务
8.任务全部结束后,ApplicationMaster向ResourceManager注销并关闭自己
4.Yarn的资源隔离机制
Yarn的资源都是指可供使用的资源,比如应该刨除操作系统本身占用,其它应用程序占用等,Yarn本身不会智能探测节点的资源
4.1 内存隔离
Yarn的内存隔离默认是采用线程监控是否超量.一旦发现超量会立即杀死任务.
Java进程在创建之初内存会暴增然后迅速回复正常,所以采用线程监控会更加合适.Cgroups机制是任何时候都不得超量,这样很容易在进程启动之初被杀死
Yarn的内存相关配置
yarn.nodemanager.resource.memory-mb Yarn上可使用的物理内存,默认8192(MB),如果节点内存资源不足,则应酌情减少这个值(Yarn本身不会智能探测节点的内存总量)
yarn.nodemanager.vmem-pmem-ratio 任务每使用1MB物理内存,则可以使用多少虚拟内存.默认2:1
yarn.nodemanager.pmem-check-enabled 是否启动一个线程检查每个任务的物理内存使用量,如果超过分配值,则将其杀死.默认为true
yarn.nodemanager.vmem-check-enabled 是否启动一个线程检查每个任务的虚拟内存使用量,如果超过分配至,则将其杀死,默认为true
yarn.scheduler.minimum-allocation-mb 单个任务可申请的最少内存量,默认1024(MB)
yarn.scheduler.maximum-allocation-mb 单个任务可申请的最大内存量,默认8192(MB)
4.2 CPU隔离
在Yarn中,因为考虑到不同的CPU的计算性能差别极大,CPU资源被重新定义了一个虚拟CPU的概念.对于高性能CPU,可以配置更高的虚拟CPU配比率.
默认情况下,Yarn不会对CPU进行调度,需要使用专门的资源管理器
Yarn的CPU相关配置
yarn.nodemanager.resource.cpu-vcores 表示该节点可使用的虚拟CPU个数,默认为8,建议配置为物理核数,高性能CPU可以配置为2倍物理核数
yarn.scheduler.minimum-allocation-vcores 单个任务申请的最少核数,默认为1
yarn.scheduler.maximum-allocation-vcores 单个任务申请的最大核数,默认为32