当前位置:   article > 正文

Apache Hadoop YARN

apache hadoop yarn
  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • yarn 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

  • yarn-site.xml

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 资源分配
      CDH中yarn对node进行系统资源分配(大约65%):eg,每个节点内存128G,yarn可使用的内存大约在80G左右,yarn.nodemanager.resource.memory-mb=80参数可以配置。如果集群内存资源紧张,可以调整此参数,但需要考虑操作系统和其他应用需要的内存。
  • 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。

  • yarn.nodemanager.vmem-pmem-ratio :物理内存与虚拟内存的比率,每用1G物理内存,默认使用2.1G虚拟内存(集群配置为4.2)
  • yarn.nodemanager.vmem-check-enabled:是否配置NodeManager的Monitor线程监控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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/763368
推荐阅读
相关标签
  

闽ICP备14008679号