管理YARN服务

前言

关于YARN,在实际工作中我们做得最多的是集群调优,也就是将计算资源合理分配。本文将会给出资源分配的思路。

重温概念

  • RM:一个负责管理运行作业,分配AM到具体作业并且执行资源限制的主进程。
  • NM:一个负责启动AM和任务容器的工作进程。
  • AM:一个为执行任务申请资源的管理进程。
  • vcore:虚拟核心,一个逻辑的处理器单元。
  • container:任务的资源池。这里包括vcores和memory。

确定计算资源和服务需要

首先需要确定每个计算节点拥有多少vcores,多少memory和多少个磁盘;其次,估计运行NM或者DN(或者该节点上需要运行的服务)需要多少资源,还需要减去操作系统本身的服务所需的资源。

估算资源

CDH推荐有以下几点:

  • 预留10-20%的内存给系统及其进程服务。
  • 最少16GB的内存留给impalad进程。
  • 不超过12-16GB的内存给RegionServer进程。
  • 另外,需要预留资源给任务缓存,例如HDFS Sort I/O buffer。
  • 对于vcore,考虑每个服务初始化时候的并发进程或者并发任务的数量。

举个栗子:

服务vcoreMemory(GB)
操作系统18092
NodeManager11024
DataNode11024
Impala00
RegionServer00
Solr Server00
available resource45251904
Total48262144

注:此表展示的为一个48C256G的计算节点资源分配,0为不运行在此节点。

NodeManager的分配

属性默认值解释
yarn.nodemanager.resource.cpu-vcores8可以分配给container的vcore数目
yarn.nodemanager.resource.memory-mb8g可以分配给container的内存总数(mb)

根据上面的栗子,假设我们有10个一样的worker节点,那么上面属性配置如下:

keyvalue
yarn.nodemanager.resource.cpu-vcores192(4倍超线程48*4)
yarn.nodemanager.resource.memory-mb251904mb

Container的分配

keydefault valueexplain
yarn.scheduler.minimum-allocation-vcores1一个container最小可申请的vcore数
yarn.scheduler.maximum-allocation-vcores32一个container最多可申请的vcore数
yarn.scheduler.increment-allocation-vcores1增长数
yarn.scheduler.minimum-allocation-mb1024一个container最小可申请内存
yarn.scheduler.maximum-allocation-mb8192一个container最大可申请内存
yarn.scheduler.increment-allocation-mb512增长数

上面属性可以根据实际情况的任务进行调节,调整完之后可以直接估算到集群同时能够跑多少个container。实际上我们生产环境是使用cgroup加上fair-scheduler来控制container的资源分配。

MapReduce的配置

keydefault valueexplain
mapreduce.map.memory.mb1GB分配给一个job的每个map任务的物理内存总数
mapreduce.map.java.opts.max.heap800MBmap进程的最大java 堆大小(单位b)
mapreduce.map.cpu.vcores1分配给一个job的每个map任务的虚拟核心数
mapreduce.reduce.memory.mb1GB分配给一个job的每个reduce任务的物理内存总数(MB)
mapreduce.reduce.java.opts.max.heap800MBreduce进程的最大java 堆大小(单位b)
mapreduce.reduce.cpu.vcores1分配给一个job的每个reduce任务的虚拟核心数
yarn.app.mapreduce.am.resource.mb1GBApplicationMaster的物理内存需求(MB)
yarn.app.mapreduce.am.command-opts800MBAM的最大堆大小(单位b)
yarn.app.mapreduce.am.resource.cpu-vcores1AM需要的虚拟核心数

属性 mapreduce.[map| reduce].memory.mb是指定container需要分配给这些map和reduce的内存,这些值应该设置成超出整个任务的堆大小
Cloudera推荐的乘积因子是0.8。实际任务决定这个最优值。Cloudera同样推荐mapreduce.map.memory.mb的值是1-2GB并且设置 mapreduce.reduce.memory.mb的值是两倍的mapper值。如果实际jobs有很多并发的任务,需要增加AM的堆大小。

一点感想

实际上当时我们的生产环境的资源控制层次是,底层使用cgroup控制,用户层面使用fair-scheduler进行分队列控制。具体配置方法可以参考我的部署脚本。 点击这里

参考

https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_ig_yarn_tuning.html

您的支持将鼓励我继续创作!
0%