container-executor.cfg文件及其各级父路径问题解决方案

本文解决Hadoop-2.6.0中配置文件container-executor.cfg及其所在目录所有者权限问题,确保Linux ContainerExecutor能正确启动容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、背景

      为了增加Hadoop CGroup来限制部分作业对CPU的占用,近日在搭建Hadoop-2.6.0的CGroup过程中,碰到了以下一个问题,提示如下(注:500为用户hadoop的id号):

File /opt/hadoop/hadoop-2.6.0/etc/hadoop/container-executor.cfg must be owned by root, but is owned by 500

      于是,就将container-executor.cfg文件的所有者修改为root,继而又出现了以下问题:

File /opt/hadoop/hadoop-2.6.0/etc/hadoop must be owned by root, but is owned by 500

      这是怎么回事呢?

二、分析

      原来,LinuxContainerExecutor通过container-executor来启动容器,但是出于安全的考虑,要求其所依赖的配置文件container-executor.cfg及其各级父路径所有者必须是root用户。源码中的判断如下:

/**
 * Ensure that the configuration file and all of the containing directories
 * are only writable by root. Otherwise, an attacker can change the
 * configuration and potentially cause damage.
 * returns 0 if permissions are ok
 */
int check_configuration_permissions(const char* file_name) {
  // copy the input so that we can modify it with dirname
  char* dir = strdup(file_name);
  char* buffer = dir;
  do {
    if (!is_only_root_writable(dir)) {
      free(buffer);
      return -1;
    }
    dir = dirname(dir);
  } while (strcmp(dir, "/") != 0);
  free(buffer);
  return 0;
}
  
/**
 * Is the file/directory only writable by root.
 * Returns 1 if true
 */
static int is_only_root_writable(const char *file) {
  struct stat file_stat;
  if (stat(file, &file_stat) != 0) {
    fprintf(ERRORFILE, "Can't stat file %s - %s\n", file, strerror(errno));
    return 0;
  }
  if (file_stat.st_uid != 0) {
    fprintf(ERRORFILE, "File %s must be owned by root, but is owned by %d\n",
            file, file_stat.st_uid);
    return 0;
  }
  if ((file_stat.st_mode & (S_IWGRP | S_IWOTH)) != 0) {
    fprintf(ERRORFILE,
        "File %s must not be world or group writable, but is %03o\n",
        file, file_stat.st_mode & (~S_IFMT));
    return 0;
  }
  return 1;
}


      在check_configuration_permissions函数中,对配置文件container-executor.cfg路径dir,在一个do循环内循环调用is_only_root_writable函数检测及所有者必须是root用户,否则不予启动容器。

      而Hadoop-2.6.0在编译时,是通过如下方式确定配置文件container-executor.cfg的位置的,首先,在hadoop-yarn-server-nodemanager的pom.xml中,设置了一个名为container-executor.conf.dir的properties,其值为yarn.basedir/etc/hadoop,实际上就是$HADOOP_HOME/etc/hadoop/,如下:

<properties>
  <!-- Basedir eeded for generating FindBugs warnings using parent pom -->
  <yarn.basedir>${project.parent.parent.basedir}</yarn.basedir>
  <container-executor.conf.dir>../etc/hadoop</container-executor.conf.dir>
  <container-executor.additional_cflags></container-executor.additional_cflags>
</properties>

      而在cmake的编译时用到了这个路径,将其赋值给DHADOOP_CONF_DIR并传入cmake编译环境,如下:

<exec executable="cmake" dir="${project.build.directory}/native" failonerror="true">
     <arg line="${basedir}/src/ -DHADOOP_CONF_DIR=${container-executor.conf.dir} -DJVM_ARCH_DATA_MODEL=${sun.arch.data.model}"/>
     <env key="CFLAGS" value="${container-executor.additional_cflags}"/>
</exec>

      这就有一个问题,要么我们把$HADOOP_HOME各级父目录及其到container-executor.cfg的各级子目录设置其所有者为root,要么我们就得修改源码,重设路径,然后重新编译Hadoop-2.6.0,命令如下:

mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc/hadoop

      这两种方案都不是很好,前者隐患太大,后者比较麻烦,需要maven、protobuf等环境。

三、方案

      通过cmake -DHADOOP_CONF_DIR=/etc/hadoop重新编译container-executor即可,步骤如下:

cd /tmp/lp_test
tar -zxf hadoop-2.6.0-src.tar.gz
chown -R root:root hadoop-2.6.0-src
cd /tmp/lp_test/hadoop-2.6.0-src/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/
cmake src -DHADOOP_CONF_DIR=/etc/hadoop
make

      cd targe/usr/local/bin/即可获得需要的container-executor文件。

      ps:由于之前一直没用过c,直到写这篇文章之前的解决方案还是直接修改的c源码,写死了配置文件路径,然后通过cmake src直接编译得到的container-executor。。。在写这篇文章总结时,才突然完全明白container-executor的生成过程,看来写写文章,总结总结还是非常好的!

<think>我们正在讨论CDH中YARNResourceManager的配置,特别是关于`yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage`参数。以下将详细解释该参数的作用和使用场景,并说明在CDH中的配置方法。###1.`yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage`参数详解该参数属于YARN的NodeManager级别配置,用于控制Linux容器执行器(LinuxContainerExecutor)如何使用cgroups进行资源限制。其作用如下:|**属性**|**说明**||----------|----------||**参数名**|`yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage`||**默认值**|`false`(在大多数CDH版本中)||**生效条件**|必须启用LinuxContainerExecutor且开启cgroups资源隔离||**可选值**|`true`(严格模式),`false`(宽松模式)|####参数作用机制:-**当设置为`false`(默认值)时**:NodeManager在资源隔离中采取**软限制**策略。即:1.允许容器**临时超用**资源(如CPU、内存),但cgroups会监控实际使用情况。2.若容器持续超用内存,Linux内核的OOMKiller会终止该容器进程。```mermaidgraphLRA[容器申请资源]-->B{资源使用}B-->|未超限|C[正常执行]B-->|临时超限|D[cgroups允许短暂超用]D-->|持续超内存|E[OOMKiller终止进程]```-**当设置为`true`时**:NodeManager启用**硬性资源限制**:1.cgroups严格按照配置值限制资源使用量。2.容器**无法超用**任何资源(例如尝试分配超过限制的内存时,将直接触发内存分配失败)。3.适用于对资源隔离要求极高的场景。####使用场景对比:|**场景需求**|**推荐值**|**原因**||--------------|------------|----------||避免瞬时资源峰值导致任务失败|`false`|允许短期超用,提高任务成功率||严格保障多租户资源隔离|`true`|防止恶意或异常任务挤占资源||测试环境或低负载集群|`false`|减少配置复杂性||生产环境高SLA要求|`true`|确保资源分配的确定性|###2.CDH中的配置步骤在ClouderaManager中配置该参数的流程如下:1.**登录ClouderaManager控制台**访问`http://<CM_HOST>:7180`,导航至**集群>YARN服务>配置**。2.**定位配置项**在搜索框输入`yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage`,或手动定位路径:**分类**→`NodeManager`→**高级配置代码段(安全阀)**。3.**设置参数值**```xml<property><name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name><value>true</value><!--或false--></property>```4.**同步配置并重启**-保存配置变更。-重启YARN服务(或仅重启NodeManager角色)。###3.与cgroups相关的其他关键参数配置`strict-resource-usage`时需联动调整以下参数:|**参数名**|**依赖关系**|**建议值**||------------|--------------|------------||`yarn.nodemanager.resource.percentage-physical-cpu-limit`|控制CPU使用率上限|如`50`表示50%物理CPU||`yarn.nodemanager.linux-container-executor.cgroups.hierarchy`|cgroups挂载路径|`/yarn`(默认)||`yarn.nodemanager.linux-container-executor.resources-handler.class`|资源处理器|`org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler`|>**验证配置生效**:>在NodeManager节点执行以下命令检查cgroup规则:>```bash>cat/sys/fs/cgroup/memory/yarn/container_*/memory.limit_in_bytes>```>若`strict-resource-usage=true`,容器内存限制将严格等于`yarn.scheduler.minimum-allocation-mb`的整数倍[^1]。###4.常见问题处理####Q:开启严格模式后任务频繁失败?**可能原因**:容器资源申请值过于接近实际需求,未预留缓冲空间。**解决方案**:-调整`yarn.scheduler.maximum-allocation-mb`增大单容器上限。-在队列配置中预留部分buffer资源(如资源池的`maximum-capacity`设为90%)。####Q:cgroups未生效?**排查步骤**:1.确认`/etc/yarn/conf/container-executor.cfg`中`cgroups.mount`已开启。2.检查NodeManager日志:```bashgrep-icgroup/var/log/yarn/yarn-nodemanager-*.log```出现`Usingstrictresourceusage`表示参数生效[^1]。§§相关问题§§1.如何在CDH中开启YARN的cgroups资源隔离?2.配置`yarn.nodemanager.resource.percentage-physical-cpu-limit=50`有何实际影响?3.YARN容器内存超用如何监控和告警?4.CDH版本升级后cgroups配置不兼容如何处理?[^2][^1]:CDHYARN资源隔离文档[^2]:CDH升级检查清单</think> ### 深入解析:CDH中YARN ResourceManager配置与`cgroups.strict-resource-usage`参数 #### 一、参数核心作用 **`yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage`** 是YARN NodeManager级别的关键参数,用于控制Linux容器是否强制执行cgroups的硬性资源限制: | **属性** | **默认值** | **作用机制** | **资源类型** | |----------|-----------|-------------|-------------| | **严格模式**(`true`) | `false` | 强制容器资源不超限 | 内存、CPU | | **宽松模式**(`false`) | ✓ (默认) | 允许短暂资源超用 | 内存、CPU | 数学模型表达资源约束: 设容器申请资源为$R_{\text{request}}$,实际使用为$R_{\text{used}}$,则: - **严格模式**:$R_{\text{used}} \leq R_{\text{request}}$(始终成立) - **宽松模式**:$R_{\text{used}} \leq R_{\text{request}} + \delta$(允许瞬时超量$\delta$) #### 二、配置场景与最佳实践 1. **场景选择** - ✅ **用严格模式**: - 多租户环境下需要强隔离性 - 安全敏感型应用(如金融计算) - CDH集群资源利用率>80%的高压场景 - ✅ **用宽松模式**: - 开发/测试环境 - 突发性负载(如临时数据分析任务) - 老旧硬件资源弹性不足时 2. **CDH配置路径** ```bash Cloudera Manager → YARN服务 → 配置搜索 → 输入参数名 → 修改值 ``` ```xml <!-- 配置示例(安全阀添加) --> <property> <name>yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage</name> <value>true</value> <!-- 或 false --> </property> ``` 3. **资源关联参数** 需协同配置(单位:MB): ```math \begin{cases} \text{NodeManager总内存} & : \texttt{yarn.nodemanager.resource.memory-mb} \\ \text{单容器最小内存} & : \texttt{yarn.scheduler.minimum-allocation-mb} \\ \text{虚拟内存比率} & : \texttt{yarn.nodemanager.vmem-pmem-ratio} \end{cases} ``` #### 三、严格模式底层机制 当启用`strict-resource-usage=true`时: 1. cgroups内存子系统通过`memory.memsw.limit_in_bytes`设置**绝对硬上限** 2. 容器超内存立即触发OOM Killer终止进程(而非先尝试回收) 3. CPU通过`cpu.cfs_quota_us`实现强隔离 ```mermaid graph TD A[容器进程] --> B[cgroups memory子系统] B -->|申请内存| C{检查剩余配额} C -->|严格模式| D[拒绝超额申请] C -->|宽松模式| E[允许超额+延迟回收] ``` #### 四、生产环境验证命令 ```bash # 检查生效配置 grep 'strict-resource-usage' /etc/hadoop/conf/yarn-site.xml # 监控容器资源隔离 watch -n 1 'cat /sys/fs/cgroup/memory/yarn/container_*/memory.usage_in_bytes' ``` > ⚠️ **重要警示**: > 切换严格模式后必须滚动重启NodeManager(非ResourceManager): > ```bash > sudo service hadoop-yarn-nodemanager restart > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值