Hadoop-2.6.0 CPU CGroup实现分析

一、概述

       Hadoop-2.6.0中对CPU CGroups的实现,主要是通过CgroupsLCEResourcesHandler来实现的,通过它的int*()系列方法初始化一些参数和环境,比如CGroups的路径等,然后在启动容器内的可执行文

件前由LinuxContainerExecutor调用preExecute()方法,进行setupLimits()即设置限额操作,而在容器内的可执行退出后(无论成功还是失败)由LinuxContainerExecutor调用postExecute()方法,进行

clearLimits()即清除限额操作。

二、实现细节

      1、CgroupsLCEResourcesHandler配置

                   通过参数yarn.nodemanager.linux-container-executor.resources-handler.class配置

                   配置为org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler即可

                   参数默认值是org.apache.hadoop.yarn.server.nodemanager.util.DefaultLCEResourcesHandler。

      2、setupLimits()核心实现

                  参见如下代码注释:

/*
  * Next three functions operate on all the resources we are enforcing.
  */
 
private  void  setupLimits(ContainerId containerId,
                          Resource containerResource)  throws  IOException {
   String containerName = containerId.toString();
 
   if  (isCpuWeightEnabled()) {
     
     // 取container申请到资源中的VCores,注意用的是虚拟core
     int  containerVCores = containerResource.getVirtualCores();
     
     // 创建CGroup,其实就是在CGroup路径中创建与CPU和容器名称相关的路径
     createCgroup(CONTROLLER_CPU, containerName);
 
     // 对应隔离方式(一),即shares
     int  cpuShares = CPU_DEFAULT_WEIGHT * containerVCores;
     
     // 更新CGroup,其实就是在上述路径中将数值cpuShares写入shares文件
     // 这个cpuShares的值就是container申请到资源中的VCores * 1024
     updateCgroup(CONTROLLER_CPU, containerName,  "shares" ,
         String.valueOf(cpuShares));
     
     // 对应隔离方式(二),即cfs_period_us、cfs_quota_us
     // 这个是需要参数yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage设置为true的
     if  (strictResourceUsageMode) {
       int  nodeVCores =
           conf.getInt(YarnConfiguration.NM_VCORES,
             YarnConfiguration.DEFAULT_NM_VCORES);
       if  (nodeVCores != containerVCores) {
         float  containerCPU =
             (containerVCores * yarnProcessors) / ( float ) nodeVCores;
         int [] limits = getOverallLimits(containerCPU);
         
         // 更新CGroup,其实就是在上述路径中将数值limits[0]和limits[1]分别写入cfs_period_us文件和cfs_quota_us文件
         updateCgroup(CONTROLLER_CPU, containerName, CPU_PERIOD_US,
           String.valueOf(limits[ 0 ]));
         updateCgroup(CONTROLLER_CPU, containerName, CPU_QUOTA_US,
           String.valueOf(limits[ 1 ]));
       }
     }
   }
}

      3、clearLimits()核心实现

                  参见如下代码注释:

private  void  clearLimits(ContainerId containerId) {
   if  (isCpuWeightEnabled()) {
     // 删除Container对应路径和文件
     deleteCgroup(pathForCgroup(CONTROLLER_CPU, containerId.toString()));
   }
}
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/245584

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。