Hadoop-2.6.0 CPU CGroup实现分析

简介: 一、概述       Hadoop-2.6.0中对CPU CGroups的实现,主要是通过CgroupsLCEResourcesHandler来实现的,通过它的int*()系列方法初始化一些参数和环境,比如CGroups的路径等,然后在启动容器内的可执行文件前由LinuxContainerExecutor调用preExecute()方法,进行setupLimits()即设置限额操作,而在容器内的可执行退出后(无论成功还是失败)由LinuxContainerExecutor调用postExecute()方法,进行clearLimits()即清除限额操作。

一、概述

       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()));
   }
}
相关文章
|
2月前
|
消息中间件 Java 应用服务中间件
我是如何通过火焰图分析让应用CPU占用下降近20%的
分享作者在使用Arthas火焰图工具进行Java应用性能分析和优化的经验。
|
2月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
75 0
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
48 2
|
7月前
|
SQL 分布式计算 Hadoop
hadoop数据查询和分析
【5月更文挑战第9天】
177 1
|
2月前
|
SQL 分布式计算 大数据
大数据平台的毕业设计01:Hadoop与离线分析
大数据平台的毕业设计01:Hadoop与离线分析
126 0
|
5月前
|
运维 监控 Linux
解决CPU与带宽高使用率问题:深入分析与应对策略
引言:性能问题的诊断与优化 在运维工作中,操作系统性能问题如影随形,典型代表是CPU使用率高和带宽使用率高的问题,它们直接影响应用的性能和响应时间。这篇记录将逐个分析这两个问题的产生原因和解决方法。
解决CPU与带宽高使用率问题:深入分析与应对策略
|
4月前
|
存储 SQL 分布式计算
Hadoop生态系统概述:构建大数据处理与分析的基石
【8月更文挑战第25天】Hadoop生态系统为大数据处理和分析提供了强大的基础设施和工具集。通过不断扩展和优化其组件和功能,Hadoop将继续在大数据时代发挥重要作用。
|
5月前
|
监控 算法 Java
|
5月前
|
监控 算法 Java
压测分析Java内存和CPU暂用
7月更文挑战第7天
71 5
|
7月前
|
机器学习/深度学习 编解码 缓存
CPU型号分析避坑指南——2、游戏电脑与办公电脑CPU该如何选择
CPU型号分析避坑指南——2、游戏电脑与办公电脑CPU该如何选择
117 0

相关实验场景

更多