2019独角兽企业重金招聘Python工程师标准>>>

Hadoop YARN同时支持内存和CPU两种资源的调度,本文介绍如何配置YARN对内存和CPU的使用。

YARN作为一个资源调度器,应该考虑到集群里面每一台机子的计算资源,然后根据application申请的资源进行分配Container。Container是YARN里面资源分配的基本单位,具有一定的内存以及CPU资源。

在YARN集群中,平衡内存、CPU、磁盘的资源的很重要的,根据经验,每两个container使用一块磁盘以及一个CPU核的时候可以使集群的资源得到一个比较好的利用。

内存配置

关于内存相关的配置可以参考hortonwork公司的文档Determine HDP Memory Configuration Settings来配置你的集群。

YARN以及MAPREDUCE所有可用的内存资源应该要除去系统运行需要的以及其他的hadoop的一些程序,总共保留的内存=系统内存+HBASE内存。

可以参考下面的表格确定应该保留的内存:

每台机子内存 系统需要的内存 HBase需要的内存
4GB 1GB 1GB
8GB 2GB 1GB
16GB 2GB 2GB
24GB 4GB 4GB
48GB 6GB 8GB
64GB 8GB 8GB
72GB 8GB 8GB
96GB 12GB 16GB
128GB 24GB 24GB
255GB 32GB 32GB
512GB 64GB 64GB

计算每台机子最多可以拥有多少个container,可以使用下面的公式:

containers = min (2*CORES, 1.8*DISKS, (Total available RAM) / MIN_CONTAINER_SIZE)

说明:

  • CORES为机器CPU核数
  • DISKS为机器上挂载的磁盘个数
  • Total available RAM为机器总内存
  • MIN_CONTAINER_SIZE是指container最小的容量大小,这需要根据具体情况去设置,可以参考下面的表格:
每台机子可用的RAM container最小值
小于4GB 256MB
4GB到8GB之间 512MB
8GB到24GB之间 1024MB
大于24GB 2048MB

每个container的平均使用内存大小计算方式为:

RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))

通过上面的计算,YARN以及MAPREDUCE可以这样配置:

配置文件 配置设置 默认值 计算值
yarn-site.xml yarn.nodemanager.resource.memory-mb 8192 MB = containers * RAM-per-container
yarn-site.xml yarn.scheduler.minimum-allocation-mb 1024MB = RAM-per-container
yarn-site.xml yarn.scheduler.maximum-allocation-mb 8192 MB = containers * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb 1536 MB = 2 * RAM-per-container
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts -Xmx1024m = 0.8 * 2 * RAM-per-container
mapred-site.xml mapreduce.map.memory.mb 1024 MB = RAM-per-container
mapred-site.xml mapreduce.reduce.memory.mb 1024 MB = 2 * RAM-per-container
mapred-site.xml mapreduce.map.java.opts   = 0.8 * RAM-per-container
mapred-site.xml mapreduce.reduce.java.opts   = 0.8 * 2 * RAM-per-container

举个例子:对于128G内存、32核CPU的机器,挂载了7个磁盘,根据上面的说明,系统保留内存为24G,不适应HBase情况下,系统剩余可用内存为104G,计算containers值如下:

containers = min (2*32, 1.8* 7 , (128-24)/2) = min (64, 12.6 , 51) = 13

计算RAM-per-container值如下:

RAM-per-container = max (2, (124-24)/13) = max (2, 8) = 8

你也可以使用脚本yarn-utils.py来计算上面的值:

#!/usr/bin/env python
import optparse
from pprint import pprint
import logging
import sys
import math
import ast''' Reserved for OS + DN + NM,  Map: Memory => Reservation '''
reservedStack = { 4:1, 8:2, 16:2, 24:4, 48:6, 64:8, 72:8, 96:12, 128:24, 256:32, 512:64}
''' Reserved for HBase. Map: Memory => Reservation '''reservedHBase = {4:1, 8:1, 16:2, 24:4, 48:8, 64:8, 72:8, 96:16, 128:24, 256:32, 512:64}
GB = 1024def getMinContainerSize(memory):if (memory <= 4):return 256elif (memory <= 8):return 512elif (memory <= 24):return 1024else:return 2048passdef getReservedStackMemory(memory):if (reservedStack.has_key(memory)):return reservedStack[memory]if (memory <= 4):ret = 1elif (memory >= 512):ret = 64else:ret = 1return retdef getReservedHBaseMem(memory):if (reservedHBase.has_key(memory)):return reservedHBase[memory]if (memory <= 4):ret = 1elif (memory >= 512):ret = 64else:ret = 2return retdef main():log = logging.getLogger(__name__)out_hdlr = logging.StreamHandler(sys.stdout)out_hdlr.setFormatter(logging.Formatter(' %(message)s'))out_hdlr.setLevel(logging.INFO)log.addHandler(out_hdlr)log.setLevel(logging.INFO)parser = optparse.OptionParser()memory = 0cores = 0disks = 0hbaseEnabled = Trueparser.add_option('-c', '--cores', default = 16,help = 'Number of cores on each host')parser.add_option('-m', '--memory', default = 64, help = 'Amount of Memory on each host in GB')parser.add_option('-d', '--disks', default = 4, help = 'Number of disks on each host')parser.add_option('-k', '--hbase', default = "True",help = 'True if HBase is installed, False is not')(options, args) = parser.parse_args()cores = int (options.cores)memory = int (options.memory)disks = int (options.disks)hbaseEnabled = ast.literal_eval(options.hbase)log.info("Using cores=" +  str(cores) + " memory=" + str(memory) + "GB" +" disks=" + str(disks) + " hbase=" + str(hbaseEnabled))minContainerSize = getMinContainerSize(memory)reservedStackMemory = getReservedStackMemory(memory)reservedHBaseMemory = 0if (hbaseEnabled):reservedHBaseMemory = getReservedHBaseMem(memory)reservedMem = reservedStackMemory + reservedHBaseMemoryusableMem = memory - reservedMemmemory -= (reservedMem)if (memory < 2):memory = 2reservedMem = max(0, memory - reservedMem)memory *= GBcontainers = int (min(2 * cores,min(math.ceil(1.8 * float(disks)),memory/minContainerSize)))if (containers <= 2):containers = 3log.info("Profile: cores=" + str(cores) + " memory=" + str(memory) + "MB"+ " reserved=" + str(reservedMem) + "GB" + " usableMem="+ str(usableMem) + "GB" + " disks=" + str(disks))container_ram =  abs(memory/containers)if (container_ram > GB):container_ram = int(math.floor(container_ram / 512)) * 512log.info("Num Container=" + str(containers))log.info("Container Ram=" + str(container_ram) + "MB")log.info("Used Ram=" + str(int (containers*container_ram/float(GB))) + "GB")log.info("Unused Ram=" + str(reservedMem) + "GB")log.info("yarn.scheduler.minimum-allocation-mb=" + str(container_ram))log.info("yarn.scheduler.maximum-allocation-mb=" + str(containers*container_ram))log.info("yarn.nodemanager.resource.memory-mb=" + str(containers*container_ram))map_memory = container_ramreduce_memory = 2*container_ram if (container_ram <= 2048) else container_ramam_memory = max(map_memory, reduce_memory)log.info("mapreduce.map.memory.mb=" + str(map_memory))log.info("mapreduce.map.java.opts=-Xmx" + str(int(0.8 * map_memory)) +"m")log.info("mapreduce.reduce.memory.mb=" + str(reduce_memory))log.info("mapreduce.reduce.java.opts=-Xmx" + str(int(0.8 * reduce_memory)) + "m")log.info("yarn.app.mapreduce.am.resource.mb=" + str(am_memory))log.info("yarn.app.mapreduce.am.command-opts=-Xmx" + str(int(0.8*am_memory)) + "m")log.info("mapreduce.task.io.sort.mb=" + str(int(0.4 * map_memory)))passif __name__ == '__main__':try:main()except(KeyboardInterrupt, EOFError):print("\nAborting ... Keyboard Interrupt.")sys.exit(1)

执行下面命令:

python yarn-utils.py -c 32 -m 128 -d 7 -k False

返回结果如下:

 Using cores=32 memory=128GB disks=7 hbase=FalseProfile: cores=32 memory=106496MB reserved=24GB usableMem=104GB disks=7Num Container=13Container Ram=8192MBUsed Ram=104GBUnused Ram=24GByarn.scheduler.minimum-allocation-mb=8192yarn.scheduler.maximum-allocation-mb=106496yarn.nodemanager.resource.memory-mb=106496mapreduce.map.memory.mb=8192mapreduce.map.java.opts=-Xmx6553mmapreduce.reduce.memory.mb=8192mapreduce.reduce.java.opts=-Xmx6553myarn.app.mapreduce.am.resource.mb=8192yarn.app.mapreduce.am.command-opts=-Xmx6553mmapreduce.task.io.sort.mb=3276

这样的话,每个container内存为8G,似乎有点多,我更愿意根据集群使用情况任务将其调整为2G内存,则集群中下面的参数配置值如下:

配置文件 配置设置 计算值
yarn-site.xml yarn.nodemanager.resource.memory-mb = 52 * 2 =104 G
yarn-site.xml yarn.scheduler.minimum-allocation-mb = 2G
yarn-site.xml yarn.scheduler.maximum-allocation-mb = 52 * 2 = 104G
yarn-site.xml (check) yarn.app.mapreduce.am.resource.mb = 2 * 2=4G
yarn-site.xml (check) yarn.app.mapreduce.am.command-opts = 0.8 * 2 * 2=3.2G
mapred-site.xml mapreduce.map.memory.mb = 2G
mapred-site.xml mapreduce.reduce.memory.mb = 2 * 2=4G
mapred-site.xml mapreduce.map.java.opts = 0.8 * 2=1.6G
mapred-site.xml mapreduce.reduce.java.opts = 0.8 * 2 * 2=3.2G

对应的xml配置为:

<property><name>yarn.nodemanager.resource.memory-mb</name><value>106496</value></property><property><name>yarn.scheduler.minimum-allocation-mb</name><value>2048</value></property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>106496</value></property><property><name>yarn.app.mapreduce.am.resource.mb</name><value>4096</value></property><property><name>yarn.app.mapreduce.am.command-opts</name><value>-Xmx3276m</value></property>

另外,还有一下几个参数:

  • yarn.nodemanager.vmem-pmem-ratio:任务每使用1MB物理内存,最多可使用虚拟内存量,默认是2.1。
  • yarn.nodemanager.pmem-check-enabled:是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true。
  • yarn.nodemanager.vmem-pmem-ratio:是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true。

第一个参数的意思是当一个map任务总共分配的物理内存为2G的时候,该任务的container最多内分配的堆内存为1.6G,可以分配的虚拟内存上限为2*2.1=4.2G。另外,照这样算下去,每个节点上YARN可以启动的Map数为104/2=52个。

CPU配置

YARN中目前的CPU被划分成虚拟CPU(CPU virtual Core),这里的虚拟CPU是YARN自己引入的概念,初衷是,考虑到不同节点的CPU性能可能不同,每个CPU具有的计算能力也是不一样的,比如某个物理CPU的计算能力可能是另外一个物理CPU的2倍,这时候,你可以通过为第一个物理CPU多配置几个虚拟CPU弥补这种差异。用户提交作业时,可以指定每个任务需要的虚拟CPU个数。

在YARN中,CPU相关配置参数如下:

  • yarn.nodemanager.resource.cpu-vcores:表示该节点上YARN可使用的虚拟CPU个数,默认是8,注意,目前推荐将该值设值为与物理CPU核数数目相同。如果你的节点CPU核数不够8个,则需要调减小这个值,而YARN不会智能的探测节点的物理CPU总数。
  • yarn.scheduler.minimum-allocation-vcores:单个任务可申请的最小虚拟CPU个数,默认是1,如果一个任务申请的CPU个数少于该数,则该对应的值改为这个数。
  • yarn.scheduler.maximum-allocation-vcores:单个任务可申请的最多虚拟CPU个数,默认是32。

对于一个CPU核数较多的集群来说,上面的默认配置显然是不合适的,在我的测试集群中,4个节点每个机器CPU核数为31,留一个给操作系统,可以配置为:

  <property><name>yarn.nodemanager.resource.cpu-vcores</name><value>31</value></property><property><name>yarn.scheduler.maximum-allocation-vcores</name><value>124</value></property>

参考文章

  • Determine HDP Memory Configuration Settings
  • Hadoop YARN如何调度内存和CPU

转载于:https://my.oschina.net/aibati2008/blog/869144

YARN的内存和CPU配置优化相关推荐

  1. Hadoop性能调优、YARN的内存和CPU配置

    转 Hadoop性能调优.YARN的内存和CPU配置 2018年06月12日 21:01:54 toto1297488504 阅读数:2417 转: https://blog.csdn.net/deh ...

  2. 详解 YARN的内存和CPU配置

    一:简单介绍 Hadoop YARN同时支持内存和CPU两种资源的调度,本文介绍如何配置YARN对内存和CPU的使用. YARN作为一个资源调度器,应该考虑到集群里面每一台机子的计算资源,然后根据ap ...

  3. aix 查看内存,CPU 配置信息

    为什么80%的码农都做不了架构师?>>>    内存lsattr -El mem0 cpu lsdev -C |grep proc CPU的信息lsattr -El proc0 #b ...

  4. yarn 内存与CPU参数设置

    每个job提交到yarn上执行时,都会分配Container容器去运行,而这个容器需要资源才能运行,这个资源就是Cpu和内存. 1.CPU资源调度 目前的CPU被Yarn划分为虚拟CPU,这是yarn ...

  5. MapReduce之如何给运行在YARN上的MapReduce作业配置内存

    关于mapreduce程序运行在yarn上时内存的分配一直是一个让我蒙圈的事情,单独查任何一个资料都不能很好的理解透彻.于是,最近查了大量的资料,综合各种解释,终于理解到了一个比较清晰的程度,在这里将 ...

  6. ubuntu下查看电脑内存硬盘CPU显卡驱动等配置命令

    ubuntu16.04查看电脑内存硬盘CPU显卡驱动等配置命令 按Ctrl+Alt+T键,调出终端窗口. 1.内存总大小:free -m mem:后面的 total 栏显示你的内存总大小. 如图:内存 ...

  7. linux ps -aux 怎么看内存,Linux下ps aux命令 与 查看CPU配置

    要对进程进行监测和控 制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和运行的状态.进程是否结束. ...

  8. win10msmpeng占内存_微软win10吃内存,CPU占用高,没有优化好?做好这3点系统快如飞...

    随着win7更新关闭日期的到来,还剩两天时间了,届时微软将不在为win7提供补丁了,安全问题就会日益严重,尽管win7使用起来很省内存,CPU占用不高,但安全问题大于一切,使用win10就成了大多数网 ...

  9. python电脑配置要求cpu-Python限制内存和CPU使用量的方法(Unix系统适用)

    问题 你想对在Unix系统上面运行的程序设置内存或CPU的使用限制. 解决方案 resource 模块能同时执行这两个任务.例如,要限制CPU时间,可以像下面这样做: import signal im ...

最新文章

  1. Python 函数的可变参数(*paramter与**paramter)的使用
  2. 【numpy学习笔记】数组的切片,索引,迭代
  3. PTAM增强现实相关
  4. DCMTK:OFStandard类的测试程序
  5. Git使用列表(四)
  6. 世界坐标系,相机坐标系和图像坐标系的转换(Python)
  7. Nginx的Gzip模块配置指令(一)
  8. jquery系列教程4-事件操作全解
  9. 中卫市地图arcgis数据shp道路地名县区边界水系2021年(下载说明)
  10. WDS+MDT部署Windows7操作系统2—;导入启动映像和安装映像
  11. 9.2 react受控组件和非受控组件
  12. keras实现deblurgan-v1(图像去模糊)
  13. java编写爬虫_Java怎么写网络爬虫?分分钟带你爬取,源码
  14. 用Win10自带SSH实现免密登录Linux
  15. 100的阶层真的算不出来吗?
  16. 加拿大计算机最好的学校排名2015年,九大院校!加拿大的计算机专业实力排名!...
  17. 如何有效练习英语口语
  18. 常用的Linux发行版
  19. 华为手机日历倒计时_倒计时5天!3辆奔驰车、15部华为手机、120万免单奖!赶快上车啦!...
  20. 每日站会是在浪费时间...吗?

热门文章

  1. 全球三大芯片架构之一MIPS倒下!转身投入RISC-V阵营
  2. 微软摊开 AI 高分作业,在线求抄
  3. 今晚19:30直播 | 这些国家为何今年扎堆去火星?航天专家庞之浩揭秘
  4. 这家剑桥校友创办的苏州AI独角兽,再获4.1亿投资,将在国内IPO
  5. 快速学习正则表达式,不用死记硬背,这里有份中文资源和互动学习网站
  6. IntelliJ IDEA上操作GitHub
  7. 深度学习专家Karpathy加入特斯拉,或将负责自动驾驶视觉研究
  8. 易传媒CTO程华奕:搭建私有DMP 你必须知道的几件事
  9. Linux内核分析--内核中的数据结构双向链表续【转】
  10. Xcode下 gdb 调试命令