前言
关于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,考虑每个服务初始化时候的并发进程或者并发任务的数量。
举个栗子:
服务 | vcore | Memory(GB) |
---|---|---|
操作系统 | 1 | 8092 |
NodeManager | 1 | 1024 |
DataNode | 1 | 1024 |
Impala | 0 | 0 |
RegionServer | 0 | 0 |
Solr Server | 0 | 0 |
available resource | 45 | 251904 |
Total | 48 | 262144 |
注:此表展示的为一个48C256G的计算节点资源分配,0为不运行在此节点。
NodeManager的分配
属性 | 默认值 | 解释 |
---|---|---|
yarn.nodemanager.resource.cpu-vcores | 8 | 可以分配给container的vcore数目 |
yarn.nodemanager.resource.memory-mb | 8g | 可以分配给container的内存总数(mb) |
根据上面的栗子,假设我们有10个一样的worker节点,那么上面属性配置如下:
key | value |
---|---|
yarn.nodemanager.resource.cpu-vcores | 192(4倍超线程48*4) |
yarn.nodemanager.resource.memory-mb | 251904mb |
Container的分配
key | default value | explain |
---|---|---|
yarn.scheduler.minimum-allocation-vcores | 1 | 一个container最小可申请的vcore数 |
yarn.scheduler.maximum-allocation-vcores | 32 | 一个container最多可申请的vcore数 |
yarn.scheduler.increment-allocation-vcores | 1 | 增长数 |
yarn.scheduler.minimum-allocation-mb | 1024 | 一个container最小可申请内存 |
yarn.scheduler.maximum-allocation-mb | 8192 | 一个container最大可申请内存 |
yarn.scheduler.increment-allocation-mb | 512 | 增长数 |
上面属性可以根据实际情况的任务进行调节,调整完之后可以直接估算到集群同时能够跑多少个container。实际上我们生产环境是使用cgroup加上fair-scheduler来控制container的资源分配。
MapReduce的配置
key | default value | explain |
---|---|---|
mapreduce.map.memory.mb | 1GB | 分配给一个job的每个map任务的物理内存总数 |
mapreduce.map.java.opts.max.heap | 800MB | map进程的最大java 堆大小(单位b) |
mapreduce.map.cpu.vcores | 1 | 分配给一个job的每个map任务的虚拟核心数 |
mapreduce.reduce.memory.mb | 1GB | 分配给一个job的每个reduce任务的物理内存总数(MB) |
mapreduce.reduce.java.opts.max.heap | 800MB | reduce进程的最大java 堆大小(单位b) |
mapreduce.reduce.cpu.vcores | 1 | 分配给一个job的每个reduce任务的虚拟核心数 |
yarn.app.mapreduce.am.resource.mb | 1GB | ApplicationMaster的物理内存需求(MB) |
yarn.app.mapreduce.am.command-opts | 800MB | AM的最大堆大小(单位b) |
yarn.app.mapreduce.am.resource.cpu-vcores | 1 | AM需要的虚拟核心数 |
属性 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