Hadoop-Yarn介绍
Yarn的架构设计
-
ResourceManager (RM) :
负责对各NM上的资源进行统一管理和调度。
将AM分配空闲的Container运行并监控其运行状态。
对AM申请的资源请求分配相应的空闲Container。
主要由两个组件构成: 调度器和应用程序管理器。 -
调度器 (Scheduler):
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。
调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container,从而限定每个任务使用的资源量。
Shceduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationMaster负责)。
总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在Container中的资源。
调度器是可插拔的,例如CapacityScheduler、FairScheduler。 -
应用程序管理器 (Applications Manager):
应用程序管理器负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动AM、监控AM运行状态并在失败时重新启动等,跟踪分给的Container的进度、状态也是其职责。 -
NodeManager (NM):
NM是每个节点上的资源和任务管理器。
它会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;同时会接收并处理来自AM的Container 启动/停止等请求。 -
ApplicationMaster (AM):
用户提交的应用程序均包含一个AM,负责应用的监控,跟踪应用执行状态,重启失败任务等。
ApplicationMaster是应用框架,它负责向ResourceManager协调资源,并且与NodeManager协同工作完成Task的执行和监控。
MapReduce就是原生支持的一种框架,可以在YARN上运行Mapreduce作业。有很多分布式应用都开发了对应的应用程序框架,用于在YARN上运行任务,例如Spark,Storm等。如果需要,我们也可以自己写一个符合规范的YARN Application。 -
Container:
是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container 表示的。 YARN会为每个任务分配一个Container且该任务只能使用该Container中描述的资源。
Mapreduce-1 架构设计
- Client: 客户端
- JobTracker : 主要负责 资源监控管理和作业调度。
- a.监控所有TaskTracker 与job的健康状况,一旦发现失败,就将相应的任务转移到其他节点;
- b.同时JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器,而调度
器会在资源出现空闲时,选择合适的任务使用这些资源.
- TaskTracker: :是JobTracker与Task之前的桥梁
- a.从JobTracker接收并执行各种命令:运行任务、提交任务、Kill任务、重新初始化任务;
- b.周期性地通过心跳机制,将节点健康情况和资源使用情况、各个任务的进度和状态等汇报给
- JobTracker.
Task Scheduler: 任务调度器(默认 FIFO,先按照作业的优先级高低,再按照到达时间的先后选择被执
行的作业) - Map Task: 映射任务
- Reduce Task: 归约任务
Yarn工作流程(mr作业提交流程)
- 1:用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
- 2:ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
- 3:ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。
- 4:ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
- 5:一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
- 6:NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
- 7:各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
- 8:应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
-
总结:
当用户向 YARN 中提交一个应用程序后, YARN 将分两个阶段运行该应用程序:- a. 第一个阶段是启动ApplicationMaster;
- b. 第二个阶段是由ApplicationMaster创建应用程序,为它申请资源,并监控它的整个运行过程,直
到运行完成。
Yarn常用命令
- yarn application –list
查看当前yarn应用程序的状态 - yarn application –kill -applicationId {application ID}
杀死当前yarn的工作进程
Yarn调优参数
【YARN中内存资源的调度和隔离】
yarn.nodemanager.resource.memory-mb
NM节点的物理内存量,以MB为单位,可以分配给容器。如果设置为-1并且yarn.nodemanager.resource.detect-hardware-capabilities为true,则会自动计算(在Windows和Linux的情况下)。在其他情况下,默认值是8192MB。注意,如果你的节点内存资源不够8GB,则需要调减小这个值,而YARN不会智能的探测节点的物理内存总量。yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量,以MB为单位。 默认为1024MB。
比这更低的内存请求会抛出一个InvalidResourceRequestException异常。
如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数。yarn.scheduler.maximum-allocation-mb
单个任务可申请的最多物理内存量,默认是8192(MB)。
比这更高的内存请求会抛出一个InvalidResourceRequestException异常。yarn.scheduler.increment-allocation-mb (CDH平台)
内存增量,默认是2048MB。yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。yarn.nodemanager.vmem-pmem-ratio
在为容器设置内存限制时,虚拟内存与物理内存之间的比率。
容器分配用物理内存来表示,而虚拟内存的使用率则可以超过这个比例。
任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。
【YARN中CPU资源的调度和隔离】
yarn.nodemanager.resource.cpu-vcores
表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数
数目相同。
如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物
理CPU总数。
如果设置为-1,并且yarn.nodemanager.resource.detect-hardware-capabilities为true,则在Windows和Linux的情况下自动根据硬件确定。yarn.scheduler.minimum-allocation-vcores
单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。yarn.scheduler.maximum-allocation-vcores
单个任务可申请的最多虚拟CPU个数,默认是32。
设置:[4,32]
若泽数据: www.ruozedata.com
交流群: 707635769