container-executor 详解

简介

container-executor 是 NodeManager 管理 Container 很重要的一个工具,是深入学习 Yarn 作业调度不可缺少的一个知识点,值得深入学习。本文只描述比较基础的功能点(目前不会包含 Docker 相关)。

核心功能点

checksetup

主要是检查 container-executor 的配置是否 ok,没有其他功能。核心代码如下:

case CHECK_SETUP: //we already did this exit_code = 0; break;

mount-cgroups

在配置项 feature.mount-cgroup.enabled 为 true 的时候为 nodemanager 挂载 cgroup。核心是调用系统函数 mount。下面代码中的是配置的挂载点。由命令行参数传入。

if (mount("none", mount_path, "cgroup", 0, controller) == 0) { // 挂载成功 if (mkdirs(hier_path, perms) == 0) { change_owner(hier_path, nm_uid, nm_gid); // 修改子目录权限。 chown_dir_contents(hier_path, nm_uid, nm_gid); } }

exec-container

前提条件:配置 feature.terminal.enabled=true

当前功能的核心实现在 container-executor.c 的函数 int exec_container(const char *command_file) 中。
在非 Docker 模式下,主要步骤如下:

// 切换用户 if (change_user(user_detail->pw_uid, user_detail->pw_gid) != 0) { _exit(DOCKER_EXEC_FAILED); } // 切换工作目录 ret = chdir(workdir); if (ret != 0) { fprintf(ERRORFILE, "chdir failed - %s", strerror(errno)); _exit(DOCKER_EXEC_FAILED); } // 执行启动脚本。 execve(binary, args, env); fprintf(ERRORFILE, "exec failed - %s\n", strerror(errno)); _exit(DOCKER_EXEC_FAILED);

最后会执行配置 launch-command 中的命令。当前步骤的核心应该主要是判断当前用户是否有权限启动 Container。

启动 Container

真正启动 Container,参数格式如下:

container-executor <user> <yarn-user> <command> <command-args>
源代码中的解释如下:

fprintf(stream, " container-executor <user> <yarn-user> <command> <command-args>\n" " where command and command-args: \n" \ " initialize container: %2d appid containerid tokens nm-local-dirs " "nm-log-dirs cmd...\n" " launch container: %2d appid containerid workdir " "container-script tokens http-option pidfile nm-local-dirs nm-log-dirs resources ", INITIALIZE_CONTAINER, LAUNCH_CONTAINER);

可以看出提供了两个功能:

  • 初始化 Container。
  • 启动 Container。
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 617 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
zeekling
应无所住,而生其心。 --《金刚经》 吾生也有涯,而知也无涯。 --《庄子》 西安