一、YARN 基础组件有哪些?
YARN中基础组件:Resource Manager、Node Manager、Container 以及 AppMaster。
ResourceManager(RM):ResourceManager 在整个集群中就只有一个,其主要负责和客户端进行通信,为每个节点进行资源的调度以及分配,与 AppMaster 一起进行资源的分配。
NodeManager(NM):YARN 中每个节点都存在一个 NodeManager,其主要对容器中的资源进行监控,处理来自 AppMaster 和 ResourceManager 的命令
ApplicationMatser(AM): ApplicationMaster 管理在 YARN 中运行的每个应用程序实例。还负责协调来自 ResourceManager 的资源,并通过 NodeManager 监视容器的执行和资源的使用(CPU、内存等的资源分配)。
Container:Container 是 YARN 中的资源抽象,它包含了很多纬度,如内存、CPU、网络等。Resource Manager 为 AppMaster 返回的资源便是用Container 表示的。YARN 会为每个任务分配一个 Container,且该任务只能使用该Container中描述的资源

  • YARN架构图

CDH-Yarn性能调优 - 图1yarn 架构图

  • YARN 运行机制

1.作业提交
RunJar 进程会向集群提交 job,Resource Manager 会为本次 job 提供一个 jobID,还会返回本次作业提交的资源路径 staging-dir。接着,客户端将资源(包括Jar包, 配置文件,)提交到 HDFS 中,最后,通过调ResourceManager 的 submitApplication 方法来提交作业
2.作业初始化
提交完成之后,ResourceManager 会将本次作业添加到一个任务队列中,然后将这些任务分配给各个 NodeManager 中,并且为每个 NodeManager 创建一个的资源容器。创建完成之后,ResourceManager 会在容器内启动 AppMaster 进程,启动完成之后在 ResourceManager 中进行注册,这样就保持了ResourceManager 和 AppMaster 的通信
3.任务分配
由创建的 AppMaster 去分配在哪些 NameNode 上运行 map 和 reduce 程序,运行 map 和 reduce 的程序会从 HDFS 中获取相关的资源再执行 map 和reduce 程序,这个进程为 YarnChild。任务完成之后,AppMaster向 ResourceManager 注销自己,ResourceManager 会回收相关的资源
4.Yarn内存分配与管理
主要涉及到ResourceManage(RM)、ApplicationMatser(AM)、NodeManager(NM)

  • ResourceManage(RM)的内存资源配置, 配置的是资源调度相关

RM1:yarn.scheduler.minimum-allocation-mb分配给AM单个容器可申请的最小内存
RM2:yarn.scheduler.maximum-allocation-mb分配给AM单个容器可申请的最大内存
注:minimum-allocation-mb最小值可以计算一个节点最大Container数量,一旦设置,不可动态改变

  • NodeManager (NM)的内存资源配置,配置的是硬件资源相关

NM1:yarn.nodemanager.resource.memory-mb节点最大可用内存
注: RM1、RM2的值均不能大于NM1的值,NM1可以计算节点最大Container数量,max(Container)=NM1/RM2,一旦设置,不可动态改变

  • ApplicationMatser (AM)内存配置相关参数,配置的是任务相关

AM1:mapreduce.map.memory.mb 分配给map Container的内存大小
AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小
这两个值应该在RM1和RM2这两个值之间
AM2的值最好为AM1的两倍,这两个值可以在启动时改变
AM3:mapreduce.map.java.opts 运行map任务的jvm参数,如-Xmx,-Xms等选项
AM4:mapreduce.reduce.java.opts 运行reduce任务的jvm参数,如-Xmx,-Xms等选项
注:这两个值应该在AM1和AM2之间
YARN内存最小限制和规整
yarn.scheduler.minimum-allocation-mb
单个任务可申请的最少物理内存量,默认是1024(MB),如果一个任务申请的物理内存量少于该值,则该对应的值改为这个数
yarn.scheduler.increment-allocation-mb
内存规整化单位,默认是1024(MB),这意味着,如果一个Container请求资源是1.5GB,则将被调度器规整化为ceiling(1.5 GB / 1GB) * 1G=2GB

  • YRAN调优有三个方面
  1. 群集配置,配置各主机
    2. YARN配置,配置内存和CPU资源
    MapReduce配置,为每个map和reduce任务分配最大和最小资源

    二、Yarn工作节点配置优化方案

    参考cloudera yarn-tuning-guide
    工作节点配置如下:
    CDH-Yarn性能调优 - 图2
    工作节点内存和CPU规划
    CDH-Yarn性能调优 - 图3
  • YARN NodeManager资源

设置如下参数(这两个参数是NodeManager能分配的最大内存和最大cpu)yarn.nodemanager.resource.memory-mb=106 可以分配给container的物理内存数量yarn.nodemanager.resource.cpu-vcores=36
基本公式 总内存X0.8=分配内存,其他分配部署组件

  • 启动MapReduce JVM

mapred.reduce.slowstart.completed.maps属性指定多少比率的Map任务需要在Reduce任务计划之前完成,对于需要快速转换的小Job,将此值设置为0可以提高性能;更大的值(高达50%)适合的大job
CDH-Yarn性能调优 - 图4

  • memory-mb内存配置

yarn.nodemanager.resource.memory-mb,表示当前节点上最大可以使用的内存, 20G(20%左右)内存分配给服务和系统使用,剩余80%左右分配给YARN,
CDH-Yarn性能调优 - 图5

  • maximum-allocation-mb配置

yarn.scheduler.maximum-allocation-mb,单个容器可申请的最大内存,应用在运行申请内存时不能超过最大值,小于最小值则分配最小值.
总内存数/容器可申请的最大内存=容器数

  • 虚拟CPU-vcores数量

数据节点每个服务分配1核共3个服务,另外给系统用2核,剩下的35核都给YARN
40-5=35
yarn.nodemanager.resource.cpu-vcores可供YARN使用的虚拟CPU数量

  • maximum-allocation-vcores配置

数据节点每个服务分配1核共3个服务,另外给系统用2核,剩下的35核都给YARN,计算方式40-5=35
yarn.scheduler.maximum-allocation-vcores 单个任务可申请的最多虚拟CPU个数
CDH-Yarn性能调优 - 图6

  • ApplicationMaster Java配置

yarn.app.mapreduce.am.resource.mb * 0.8得到的

  • yarn.nodemanager.log.retain-seconds

yarn.nodemanager.log.retain-seconds 应用程序输出日志保存的时间