1.简述node
Yarn是Hadoop2.X的核心组件之一.负责集群的资源管理.(不局限于Hadoop,Spark等等至关多的组件均可以利用Yarn来进行资源管理与调度)编程
Yarn自己由两大组件构成:ResourceManager(RM)和NodeManager(NM).在Yarn中,整个资源管理依靠这两大组件来共同完成.网络
ResourceManager:框架
ResourceManager负责整个集群的资源管理与分配.它自己再由两个组件构成编程语言
应用程序管理器ApplicationManageroop
ApplicationManager是RM的中心入口,负责管理整个集群的应用程序.包括应用程序的提交,与调度器协商资源,跟踪分配的Container,启动AppMaster,监控AppMaster执行状态,失败重启等等性能
调度器(Scheduler)spa
调度器根据根据队列,容量等等条件(好比每队最多分配多少,最多执行做业数多少),整体上将系统中的资源分配给各个应用程序.操作系统
对于某一个应用程序,根据对该应用程序的请求进行资源分配.线程
资源分配的最终结果是一个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