赞
踩
YARN架构结构
yarn是基于Master/Slave模式的分布式架构,yarn的架构结构如图:
【1】:client,可以理解为编写的大数据程序。
【2】:ResourceManager(RM),主要有两个组件,Scheduler和ApplicationManager(AM)。2.4.0版本后新增了RM HA特性。
Scheduler:调度器,负责将内存、cpu、磁盘、网络IO分配给各个NM。
ApplicationManager,负责client任务的提交,并把任务分发给各个NM。
【3】:NodeManager(NM),监控ApplicationMaster和Container的使用情况,并将节点状态发送给RM
【4】:ApplicationMaster(AM):应用集群中的master,HA机制,保证可用性。eg,spark cluster-yarn模式下的master集群。
【5】:Container:容器,程序运行的容器。
YARN运行过程
yarn cluster模式
【1】:客户端提交application到RM,RM判断资源(CPU、内存)需要使用状况,配置文件的读取,设置application名称。
【2】:RM选取某一个NodeManager启动AppMaster(AM),AppMaster 初始化SparkContext。该NodeManager为Driver。
【3】:AppMaster向RM申请资源(申请container的内存大小等),并在每个NodeManager上启动Container容器(执行分布式程序),如果是spark任务,则Container里面初始化Executer。yarn中的Container和spark中的executer可以理解为等同。
【4】:AppMaster里的sparkContext与Container通信可以采用akka
【5】:AppMaster所在的机器就是driver,application提交到RM上,client就可以关闭了。
【1】:客户端初始化SparkContext,客户端就是driver。
【2】:客户端提交application到RM,RM判断资源(CPU、内存)需要使用状况,配置文件的读取,设置application名称。
【3】:RM选取某一个NodeManager启动AppMaster(AM)
【4】:AppMaster向RM申请资源,并在每个NodeManager上启动Container容器,开始默认容器数量为1个,任务执行过程中资源不足,会再次向RM申请资源,在NodeManager上启动新的Container容器。
【5】:客户端里的sparkContext与Container通信可以采用akka
ResourceManager中的配置
yarn.scheduler.minimum-allocation-mb:(1G)单个容器可申请的最小内存
yarn.scheduler.maximum-allocation-mb:(8G)单个容器可申请的最大内存
NodeManager中的配置
yarn.nodemanager.resource.memory-mb:(80G)yarn节点可用的最大内存,则container最大数量=80G/1G
yarn.nodemanager.vmem-pmem-ratio:默认2.1,虚拟内存率,占task所用内存的百分比???。
yarn web UI中 总核数=yarn节点最大内存节点数 总内存数=yarn节点最大核数节点数
ApplicationMaster中的配置,此处以MapReduce为例进行说明(mapred-site.xml)
mapreduce.map.memory.mb:map任务内存大小
mapreduce.reduce.memory.mb:reduce任务内存大小,默认情况下,reduce是map内存大小的2倍
两个参数值,应该在container的内存最大、最小值之间
mapreduce.map.memory.mb:和JVM相关
mapreduce.reduce.memory.mb:和JVM相关
yarn Scheduler类
【1】:FairScheduler,公平调度
单个用户对应一个队列,各个队列或者用户之间平均分配资源
【2】:FifoScheduler,先进先出调度,
全局一个队列,任务都进入该队列,采用先进先出的方式执行任务。
【3】:CapacityScheduler,容量调度
单个组织对应一个队列,一个组织中可以有多个用户,队列内部采用先进先出方式。
各个队列设置最大、最小占用资源比例,避免各个队列彼此影响。
参考文档:https://blog.csdn.net/nougats/article/details/71075042
yarn 应用
YARN中cluster模式下内存分布
需要用到的配置
假设:一个node上有两个container,每个container都启动一个executor(一个executor启动一个jvm),如上图executor1启动一个Map task,另外一个contaner的executor启动一个 Reduce task
yarn.nodemanager.resource.memory-mb:单个node上yarn分配给全部容器最大的物理内存(集群配置为160G),等同于节点上所有容器总内存不能超过160G。
yarn.scheduler.maximum-allocation-mb:RM上,单个容器可申请的最大的物理内存(集群配置为80G)
yarn.scheduler.minimum-allocation-mb:RM上,单个容器可申请的最小的物理内存(集群配置为1G)
mapreduce.map.java.opts:executor中每个map任务的最大物理内存(缺省值为200M)
mapreduce.map.memory.mb:container中执行map任务的最大物理内存(集群配置为2G)
mapreduce.reduce.memory.mb:container中执行reduce任务的最大物理内存(集群配置为4G)
mapreduce.reduce.java.opts:executor中每个reduce任务的最大物理内存(缺省值为200M)
为什么map、reduce会有两种配置参数呢?
1:yarn是一个通用的计算平台,设计之初就考虑了各种语言的程序运行于这个平台之上,而非进使用JVM系列的语言,所以container被设计成一个抽象的计算单元,于是它就有了自己的内存配置参数
2:mapreduce.*.java.opts,是专门为JVM设置的参数,因为executor是spark中的概念,所以此处理解为executor中的每个map/reduce任务的最大物理内存
NodeManager是如何管理Container呢?
1:NodeManager专门有一个monitor线程,默认三秒一次监控所有Container的总物理内存和虚拟内存的使用情况,查看每个container是否超过了其预设的内存大小。而计算Container内存大小的方式,是计算Container上所有子进程所用内存的和。一旦某个Container使用的物理/虚拟内存量超过其预设的物理/虚拟内存量,则Monitor线程就会无情的kill掉此container
2:顾有时会出现此异常,Container [pid=12303,containerID=container_1541660087428_76454_02_000001] is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 3.9 GB of 4.2 GB virtual memory used. Killing container
假如spark submit时参数设置executor-memory:1G,这1G是如何在上面场景中分配的呢?
1:我们把yarn中Container理解为一个大盒子,这个盒子最大为80G,这个盒子里面map/reduce 任务最大为2/4G。
2:我们把spark中executor理解为另外一个盒子,这个盒子我们设置大小为1G,在这个盒子里面map/reduce任务都为默认缺省值200M
3:spark submit 提交任务的过程可以看做为多个executor盒子在Container盒子存放的过程。
3:该场景下,一个Container最多可以起80个executor
4:如果mapreduce.map.java.opts > mapreduce.map.memory.mb时,NodeManager的Monitor线程就会kill掉该Container。
如何计算Container中的虚拟内存呢?
1:虚拟内存:操作系统将磁盘空间当做内存空间供给程序使用,yarn.nodemanager.vmem-pmem-ratio参数中虚拟内存与操作系统的虚拟内存一致。
2:NodeManager接收AppMaster传递过来的Container后,会用Container的物理内存大小(pmem)*yarn.nodemanager.vmem-pmem-ratio得到Container虚拟内存大小的限制,为vmemLimit。monitor线程监控pmem(物理内存)和vmem(虚拟内存)的使用情况。如果当前vmem大于vmemLimit限制,则会kill掉该容器。
3:Container的物理内存大小(pmem)是多少呢,其实是min(mapreduce.map.memory.mb,mapreduce.reduce.memory.mb)=2G。,一般情况下同一个container只运行一个executor,而同一时刻在一个executor只有一个Map或者Reduce任务在运行,所以此处最小值就可以理解为该Container的物理内存。
参考文档:
http://www.cnblogs.com/princessmeiyi/p/5238215.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。