container-executor 詳解
簡(jiǎn)介
container-executor 是NodeManager管理Container很重要的一個(gè)工具,是深入學(xué)習Yarn作業(yè)調度不可缺少的一個(gè)知識點(diǎn),值得深入學(xué)習。本文只描述比較基礎的功能點(diǎn)(目前不會(huì )包含Docker相關(guān))。
核心功能點(diǎn)
checksetup
主要是檢查container-executor的配置是否ok,沒(méi)有其他功能。核心代碼如下:
case CHECK_SETUP:
//we already did this
exit_code = 0;
break;
mount-cgroups
在配置項feature.mount-cgroup.enabled為true的時(shí)候為nodemanager掛載cgroup。核心是調用系統函數mount
。下面代碼中的是配置的掛載點(diǎn)。由命令行參數傳入。
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
當前功能的核心實(shí)現在container-executor.c
的函數int exec_container(const char *command_file)
中。
在非Docker模式下,主要步驟如下:
// 切換用戶(hù)
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);
}
// 執行啟動(dòng)腳本。
execve(binary, args, env);
fprintf(ERRORFILE, "exec failed - %s\n", strerror(errno));
_exit(DOCKER_EXEC_FAILED);
最后會(huì )執行配置launch-command中的命令。當前步驟的核心應該主要是判斷當前用戶(hù)是否有權限啟動(dòng)Container。
啟動(dòng)Container
真正啟動(dòng)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);
可以看出提供了兩個(gè)功能:
- 初始化Container。
- 啟動(dòng)Container。

0 評論