关于ResourceManager的高可用可以查看参考文档,也可参考这个配置。
概述
更多关于yarn的架构和工作原理的细节,可以查看:参考文档。
关于hadoop、yarn、mapreduce、spark之间的关系,可以用一句话来概括,hadoop提供了分布式文件系统hdfs,yarn提供了集群管理功能,可以管理MapReduce、Spark、Tez、storm等计算框架。
下面介绍yarn中的组件。
RM
ResourceManager(简称RM)分为Scheduler和ApplicationsManager(简称ASM),其中:
-
ASM
- 接收客户端发送来的应用程序提交请求
- 根据客户端的设置,获取用于运行ApplicationMaster(简称AM)的container(也就是说AM和普通任务一样都运行在NodeManager(简称NM)的container中)
- 获取到container后,在container上启动AM。同时ASM还负责监控AM的状态,并在AM失败时,重启它
-
Scheduler
-
接收AM的通信
- AM通过心跳告知RM,AM还活着,同时心跳中还会包含任务的进度信息
- AM根据任务需求,向RM申请containers,需要注意的是:Scheduler根据集群容量、优先级、调度策略等,给所有正在运行的AM同时分配资源。因此对某个AM来说,RM不一定立刻给它分配containers,并且也不是一下子就把AM需要的所有的containers都分配给它
- Scheduler是一个可插拔的组件,yarn提供了很多可用的调度器,比如Capacity Scheduler、Fair Scheduler等
AM
AM在申请到containers之后,会与NM通信启动任务。AM既可以通过RM的心跳回复获取containers完成情况,也可以直接通过NM来主动监测启动的containers,在任务执行失败时,AM负责重启它们。yarn自带了两个AM,其中一个是用于演示AM编写方法的实例程序distributedshell,另外一个是运行MapReduce应用程序的AM—MRAppMaster。
综上所述,RM负责监控AM,AM负责监控任务;AM完成任务的容错,RM完成应用程序的调度。因此可以说,yarn把MapReduce 1.0中的JobTracker分为了RM和AM两部分。
NM
NM负责管理单个节点上的资源,一方面它会定时向RM汇报本节点的资源使用情况和各个container的运行状态,另外一方面它接收并处理来自AM的Container启动/停止等各种请求。
Container
Container是yarn中资源分配的基本单位,Container抽象的封装了多个维度上的资源,比如:CPU、内存、磁盘、网络等。与MapReduce 1.0中的map slot 和 reduce slot不同,Container是动态的;目前yarn只支持CPU和内存两种资源,且使用cgroups进行资源隔离。
配置
通信相关的配置
- yarn.resourcemanager.address
ASM的地址,客户端通过该地址向RM提交、追踪或杀死应用程序
默认值:${yarn.resourcemanager.hostname}:8032
- yarn.resourcemanager.scheduler.address
Scheduler的地址,AM通过该地址向RM申请或释放资源
默认值:${yarn.resourcemanager.hostname}:8030
- yarn.resourcemanager.resource-tracker.address
NM通过该地址向RM发送心跳和领取任务等
默认值:${yarn.resourcemanager.hostname}:8031
- yarn.resourcemanager.webapp.address
RM的web UI的地址,用户可以通过该地址查看集群信息
默认值:${yarn.resourcemanager.hostname}:8088
通常情况下,只要配置好 yarn.resourcemanager.hostname 属性即可。如果什么都没配置的话,可能会因为这些地址使用127.0.0.1,而导致Client、AM、NM无法与RM进行通信。
Container相关的配置
- yarn.scheduler.minimum-allocation-mb
单个Container的最小内存
默认值:1024
- yarn.scheduler.maximum-allocation-mb
单个Container的最大内存
默认值:8192
- yarn.scheduler.minimum-allocation-vcores
单个Container的最小虚拟CPU数量
默认值:1
- yarn.scheduler.maximum-allocation-vcores
单个Container的最大虚拟CPU数量
默认值:32
NM相关的配置
NM是运行在集群中的节点上的,所以NM的内存和虚拟CPU数量,不应该高于其所在节点的物理内存和CPU核心数;Container是NM管理的(一个NM管理多个Container),所以Container的最大内存和最大虚拟CPU数量,不应该超过NM的内存和虚拟CPU数量;AM是运行在Container中的,所以AM所使用的内存和虚拟CPU数量,不应该超过Container的最大内存和最大虚拟CPU数量。
MapReduce的一些配置(mapred-site.xml)
- mapreduce.map.java.opts
- mapreduce.map.memory.mb
- mapreduce.reduce.java.opts
- mapreduce.reduce.memory.mb
在hadoop2及以上版本中,map、reduce任务都是运行在container中的,mapreduce.{map|reduce}.memory.mb用来设置container的内存大小。如果container的内存超限,会被yarn杀死。为了执行map、reduce任务,yarn会在container中启动一个JVM,mapreduce.{map|reduce}.java.opts用来设置container启动的jvm参数,通过设置Xmx来设置map 或者reduce task的最大堆内存。理论上,{map|reduce}.java.opts设置的最大堆内存要比{map|reduce}.memory.mb小
- mapreduce.task.io.sort.mb
map任务的环形缓冲区的大小
默认值:100
- mapreduce.framework.name
mapreduce的运行模式,可以是local、yarn、yarn-tez等
其它常用配置
- yarn.nodemanager.aux-services
NM上运行的附属服务。需配置成mapreduce_shuffle
,才可运行MapReduce程序
默认值:“”
- yarn.nodemanager.pmem-check-enabled
是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉
默认值:true
- yarn.nodemanager.vmem-check-enabled
是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉
默认值:true
- yarn.resourcemanager.scheduler.class
启用的资源调度器主类。目前可用的有FIFO、Capacity Scheduler和Fair Scheduler
默认值:
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler
在使用Capacity Scheduler的时候,需要注意capacity-scheduler.xml中的yarn.scheduler.capacity.maximum-am-resource-percent属性,该属于用于控制集群中有多少资源可以用于运行AM,进而控制集群中并发运行的应用的数量。当集群中的资源乘以这个百分比之后,连一个AM都满足不了的话,提交的应用程序,就会一直处于ACCEPTED状态
参考文档