CDH集群调优:内存、Vcores和DRF

原文地址:http://blog.selfup.cn/1631.html?utm_source=tuicool&utm_medium=referral

吐槽

最近“闲”来无事,通过CM把vcores使用情况调出来看了一眼,发现不论集群中有多少个任务在跑,已分配的VCores始终不会超过120。而集群的可用Vcores是360(15台机器×24虚拟核)。这就相当于CPU资源只用到了1/3,作为一个半强迫症患者绝对不能容忍这样的事情发生。

分析的过程不表,其实很简单就是几个参数的问题。本以为CM能智能的将这些东西配好,现在看来好像不行。以下记录结论。

DRF和相关参数

DRF: Dominant Resource Fairness,根据CPU和内存公平调度资源。CDH动态资源池默认采用的DRF计划策略。简单的理解就是内存不够的时候,多余的CPU就不会分配任务了,就让他空着;CPU不够的时候,多出来的内存也不会再启动任务了

理解这个计划策略后,再查看Yarn启动任务时资源相关的参数,发现有以下几个参数可能会产生影响:

  • mapreduce.map.memory.mb ,map任务内存,cdh默认1G
  • mapreduce.map.cpu.vcores ,map任务虚拟CPU核数,cdh默认1
  • mapreduce.reduce.memory.mb ,reduce任务内存,cdh默认1G
  • mapreduce.reduce.cpu.vcores ,reduce任务虚拟CPU核数,cdh默认1
  • yarn.nodemanager.resource.memory-mb ,容器内存,cdh默认8G
  • yarn.nodemanager.resource.cpu-vcores ,容器虚拟CPU核数,cdh默认8,但CM会自动检测内核数并修改,我这里被自动改成了24。

可以看到默认配置下,CPU核数和内存是1:1G的比例来启动任务的。

接着查看了下分配给Yarn的内存,果然是8(容器内存)×15(集群节点数量)=120G,所以可用内存比可用vcores(360个)比起来就小太多了,导致按照1:1G的比例下最多只能使用120个vcores。

以上只是猜想

测试

为了证实我的猜想,将 yarn.nodemanager.resource.memory-mb 调成了16G(咱内存128G,管够)。重启yarn后,再次启动MR,于是有了下图:

2

可以看到参数调整前,Yarn可用内存为120G,调整后变成了240G;vcores由调整前的120变成了240。至此,证明猜想正确。

所以对于这个集群来说,由于内存为128G,内核为24个,所以完全可以将yarn.nodemanager.resource.memory-mb 参数调成24G,这样就能将所有的CPU都利用起来了。

测试结果

yarn.nodemanager.resource.memory-mb 为8G时:

Time taken: 3794.17 secondsTotal MapReduce CPU Time Spent: 3 days 10 hours 43 minutes 22 seconds 640 msec

yarn.nodemanager.resource.memory-mb 为16G时:

Time taken: 2077.138 secondsTotal MapReduce CPU Time Spent: 3 days 12 hours 55 minutes 43 seconds 210 msec

可以看到确实快了很多很多。(ps:两次跑的任务所用的数据不一样,以免缓存导致第二次跑相同的任务会速度比第一次快,但两次任务所用的数据量差不多,都在650G左右)

其它

查看VCores SQL
<span class="operator"><span class="keyword" style="font-weight: bold;">SELECT</span> allocated_vcores_cumulative, available_vcores <span class="keyword" style="font-weight: bold;">where</span> category=YARN_POOL <span class="keyword" style="font-weight: bold;">and</span> serviceName=<span class="string" style="color: rgb(221, 17, 68);">"yarn"</span> <span class="keyword" style="font-weight: bold;">and</span> queueName=root</span>
查看分配给Yarn的内存 SQL
<span class="operator"><span class="keyword" style="font-weight: bold;">SELECT</span> allocated_memory_mb_cumulative, available_memory_mb <span class="keyword" style="font-weight: bold;">where</span> category=YARN_POOL <span class="keyword" style="font-weight: bold;">and</span> serviceName=<span class="string" style="color: rgb(221, 17, 68);">"yarn"</span> <span class="keyword" style="font-weight: bold;">and</span> queueName=root</span>

当然最简单的查看方式就是在CM的“动态资源池”页面看。

------------------------------分割线--------------------------

本博主:这篇文章将Spark集群的内存配置与VCores的数量的关系讲得浅显易懂,是一篇非常不错的博文。从文中我们知道,原文博主的集群一开始的VCores的数量只能用到1/3是由于yarn中容器内存设置太小,而每个可用的VCore都要占用1G的内存的原因,所以容器内存限制了可用的VCores数量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值