Yarn实现原理之CPU管理

(本文基于hadoop2.6.0版本,如有错误,欢迎留言指正。)

Yarn中对于CPU的管理使用了CGroup方案,即使用CGroup来对Yarn中Container的计算能力进行管理。RM中的调度器根据AM的资源请求分配相应数量资源的Container,主要包括内存和CPU两种资源,CPU的分配与内存的分配过程是一样的,具体调度过程见另一篇文章。本文着重讲解Container中CPU的管理。

Yarn中包含两类容器执行脚本,若想实现对CPU的控制,需要使用LinuxContainerExecutor.java来启动容器,默认的 DefaultContainerExecutor.java无法管理CPU,可以将配置文件中的yarn.nodemanager.Linux-Container-executor.resources-handler.class参数值设为org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler

LinuxContainerExecutor可以实现以容器所属用户的身份运行container,而默认的 DefaultContainerExecutor只能以普通管理员身份运行container。

首先我们需要关注配置文件中的两个参数,源码中配置文件的路径为hadoop-yarn-api\src\main\java\org\apache\hadoop\yarn\conf\YarnConfiguration.java

153851_q5rh_3063707.png

第一个参数表示该节点上可以分配给容器使用的CPU核数,用vcores表示,默认为8,yarn中之所以采用虚拟CPU来表示,是为了消除不同CPU性能之间的差异,默认1个物理CPU对应一个虚拟CPU,需要手工设置。

第二个参数表示节点上的CPU可以分配给所有容器的使用时间比例,默认为100%,即所有CPU的计算能力全部供Yarn使用。

还有一个参数是用来限制是否允许在CPU空闲时,可以将多余的计算能力分配给其他进程使用,默认允许,若设为TRUE,则会严格按照资源限制控制容器的CPU使用时间,该参数如下:

153946_hhru_3063707.png

了解完几个主要参数后再来看一下容器的CPU使用是具体怎样控制的。

该控制逻辑代码在hadoop-yarn-server\hadoop-yarn-server-nodemanager\src\main\java\org\apache\hadoop\yarn\server\nodemanager\util\CgroupsLCEResourcesHandler.java文件中。

下面看一下几个关键的逻辑点:

154019_KP7I_3063707.png

这两个方法会分别在容器启动前和容器执行完后进行调用,具体的调用过程是在hadoop-yarn-server\hadoop-yarn-server-nodemanager\src\main\java\org\apache\hadoop\yarn\server\nodemanager\LinuxContainerExecutor.java中的launchContainer方法中进行调用的。

第一个方法主要用来设置容器的CPU使用限额,具体实现在setupLimits方法中:

154518_owp6_3063707.png

这个方法首先获取Container中分配的虚拟CPU数量,接着创建CGroup的文件路径,即在CGroup路径中创建与CPU和容器名称相关的路径。在这个方法中可以看到有两种CPU的限制方式:

第一种是通过cpuShares参数,该参数其实就是依据容器中分配的虚拟CPU数量来计算使用时间的,比如容器A为1 vcores,容器B为2 vcores,则容器A和B在满负荷运行时可以使用的CPU配额为1:2,该配比是相对的,即若只有一个容器,则可以使用100%的CPU时间。这种方式在保证公平的情况下能更加充分利用资源。

第二种需要开启上述提到的cgroups.strict-resource-usage参数, 即设为TRUE,通过调用 getOverallLimits方法得到具体限额,然后将限额写入cfs_period_us和cfs_quota_us文件中,这种方式限制的是绝对使用时间,来看一下getOverallLimits方法:

154814_amqQ_3063707.png

154842_Z0zz_3063707.png

这里涉及到了几个参数:

yarnProcessors:代表在某个节点上yarn中可使用的虚拟CPU数量, 最小不能低于0.01,该参数的值是通过在init方法中调用NodeManagerHardwareUtils.getContainersCores方法进行初始化的,即根据配置文件中设定的CPU分配比例来计算Yarn可用的CPU数量:

154929_Ps19_3063707.png

154958_rgpV_3063707.png

quotaUS:就是在一个时间周期内可使用的 cpu 时间。

periodUS:时间周期(每个cpu core)。

具体计算方式在getOverallLimits方法中:

quotaUS默认值为1000 * 1000,即1秒,periodUS默认值为(1000 * 1000/yarnProcessors)取整。

当yarnProcessors小于1时,quotaUS的值为 (periodUS * yarnProcessors)取整,但最小不能低于1000ms,periodUS的值为1000 * 1000,即1秒。

将这两个值返回并写入文件中。

 

当容器执行完毕时,会清理上面设置的CPU限额配置,具体实现在下面的方法中:

155024_V9Ci_3063707.png

 

 

关于CGroup的内部具体实现可参考:

http://www.cnblogs.com/lisperl/archive/2012/04/23/2466721.html

http://xiezhenye.com/2013/10/%E7%94%A8-cgroups-%E7%AE%A1%E7%90%86-cpu-%E8%B5%84%E6%BA%90.html

 

转载于:https://my.oschina.net/u/3063707/blog/856338

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值