YARN源码解析之NodeManager中的ContainerExecutor

article/2025/7/27 21:22:51

在NodeManager中,有三种运行Container的方式,它们分别是:

  • DefaultContainerExecutor
  • LinuxContainerExecutor
  • DockerContainerExecutor

从它们的名字中,我们就能看得出来,默认情况下,一定使用的是DefaultContainerExecutor

而一般情况下,DefaultContainerExecutor也确实能够满足我们的需求。

在这篇文章中,我们会首先介绍DefaultContainerExecutor,然后简单介绍LinuxContainerExecutorDockerContainerExecutor

DefaultContainerExecutor

这个ContainerExecutor的实现实际上很简单,就是通过构建一个脚本来执行而已。支持Windows脚本以及Linux脚本。

在ContainerExecutor启动一个Container的过程中,涉及到了三个脚本,它们分别是:

  • default_container_executor.sh
  • default_container_executor_session.sh
  • launch_container.sh

这三个脚本,都是跟Container相关的,所以它们都被放在一个Container所代表的目录结构下。

在NodeManager中,会为每个Application,以及每个Container建立一个对应的目录,在每个Container的目录下,就放置了一些运行这个Container必需的信息。

一般来说,这些目录是位于/tmp这个目录下,并且会在一个Application完成后,被删除。减少磁盘空间的消耗。

Container在磁盘上的表示

我们分别查看一下,上面我们所说的那三个脚本文件的内容。

default-container_executor.sh:

 

我们可以看到,在这个脚本文件的内部,会启动default_container_executor_session.sh这个脚本,并将执行结果写入到这个Container的一个名为Container ID+pid.exitcode的文件中。

default_container_executor_session.sh这个脚本呢?

我们可以看到,它主要是启动launch_container.sh这个脚本。

而我们可以看到,launch_container.sh中,就负责运行相应的Container,也能是MRAppMaster,也可能是Mapper或者Reducer:

launch_container.sh中,设置了很多环境变量。

这里因为我查看了一个ApplicationMaster的Container,所以启动的是MRAppMaster

那么,DefaultContainerExecutor应该就是首先执行default_container_executor.sh这个脚本,对吧?

嗯嗯,没错的。

我们来查看一下代码:

实际上,DefaultContainerExecutor中,实例化的是一个UnixLocalWrapperScriptBuilder对象,而这个对象,是LocalWrapperScriptBuilder的一个子类,并且在constructor中调用了LocalWrapperScriptBuilder的constructor。

总之,最后DefaultContainerExecutor确实就是直接调用了default_container_executor.sh这个脚本。

我们可以看到,它的实现实际上非常简单。

同时,我们也可以看到,这个实现有一些问题,即,对于资源隔离做的并不好。全部Container都是由运行NodeManager的那个用户启动的。

LinuxContainerExecutor

而LinuxContainerExecutor就解决了上面的那个问题。

从代码中,我们可以看到,现在,launch a container时,它是调用了container-executor这个程序:

那么,container-executor这个程序是啥东西呢?

在Hadoop的安装目录下,bin目录中,你应该就会发现这个程序。

我们可以看到,可以直接使用这个程序来实例化一个Container,启动一个Container,给这个Container发信号,以及删除这个Container,而且,我们还可以看到,它还支持挂载cgroup,并且我们可以指定运行Container的用户。

container-executor这个程序,是用c语言写的。它的源代码在$HADOOP_SOURCE_CODE_ROOT/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/src/main/native/container-executor/impl中。

其中最重要的功能,都是在container-executor.c这个源文件中。我们还是主要来看它是如何启动一个Container的。

launch_container_as_user()这个函数中,就实现了启动一个Container的功能。

其中最重要的是这么两部分:

我们可以看到,在上面的代码块中,fork了一个子进程。fork()这个函数,我们可以看一下它的介绍。

从文档中,我们可以看到,对于子进程来说,这个函数会返回0,而对于父进程来说,则返回子进程的的pid。

所以,我们可以看到,子进程会执行execlp()函数,来运行launch_container.sh脚本,启动一个Container。

而父进程则会一直waitpid()函数来查看Container的运行状态,一旦运行结束,就将状态码写到特定文件中。

那我们上面提到的,我们可以指定运行这个Container的用户,是如何实现的?

就是这个函数中的change_user()实现的啦。

那cgroup又是怎么一回事呢?

cgroup是Linux中实现资源隔离的一种方式,Docker就是基于CGroup以及Namespace实现的。

这部分的代码我没有细看,但是从这个函数中,确实能看到cgroup的身影。

总的来说,LinuxContainerExecutor相对于DefaultContainerExecutor,它的有点在于,可以手动指定运行Container的用户,并且可以通过cgroup来增强不同的Container之间的隔离性。

当然啦,它也有缺点。毕竟我们手动指定的用户,必须在每个NodeManager上面都存在才行呀,否则运行起来就会出错误。

DockerContainerExecutor

这个ContainerExecutor,就是把Docker结合进来了。这样做的好处在于,由于Docker是能够保证一个Container使用的资源,不会大于分配给它的资源,所以,不会出现过度使用资源的问题。

这个ContainerExecutor的实现更加简单,就是运行docker run命令启动Docker Container,通过docker inspect观察Container的状态。

这里不再多做介绍。

刚开始学习Hadoop的时候,就意识到Container可以用Docker来做,只是没想到YARN中,已经做到这一点了。

总结

并不是很清楚为什么LinuxContainerExecutor中,container-executor要用C实现。可能是涉及到的底层操作比较多,比较密集,就用C来实现吧。


转载自:简书 YARN源码解析(7)-NodeManager中几种ContainerExecutor

 


http://chatgpt.dhexx.cn/article/fCjR97UM.shtml

相关文章

linux进程状态怎么手动切换,二十六、Linux 进程与信号---system 函数 和进程状态切换...

26.1 system 函数 26.1.1 函数说明 system(执行shell 命令) 相关函数 fork,execve,waitpid,popen #include int system(const char * string); 函数功能:简化 exec 函数 函数说明 system()会调用 fork() 产生子进程,由…

进程控制(详解)

进程控制 上篇文章介绍了进程的相关概念,形如进程的内核数据结构task_struct 、进程是如何被操作系统管理的、进程的查看、进程标识符、进程状态、进程优先级、已经环境变量和进程地址空间等知识点; 本篇文章接着上篇文章继续对进程的控制进行展开&#…

c++跨平台技术学习(三)--使用标准API

Posix.1 API定义了大量的函数,在各方面的功能都很丰富,下面对其进行介绍 System V接口定义 它是一份描述了AT&T UNIX System V操作系统的文档,与POSIX.1保持一致,是它的一个超集。SVID由基础系统和扩展定义,它只…

BUUCTF刷题记录 Ping Ping Ping

[GXYCTF2019]Ping Ping Ping 进入页面 然后/?ip127.0.0.1|ls 进入 读取flag.php 再cat$IFS$1indnx.php 再变量拼接 ?ip127.0.0.1;ag;cat$IFS 1 f l a 1fla 1flaa.php 转至 http://1d22a0a5-c6a0-43f1-8e52-e5a33ec7e044.node3.buuoj.cn/?ip127.0.0.1;ag;cat$IFS 1 f l a …

JVM 答疑解惑

JVM是什么? 平常接触的东西都存在哪里? 类如何加载? 怎么运行? 清洁工怎么工作? JVM是什么? Java 虚拟机屏蔽了与具体操作系统平台相关的信息,使得 Java 语言编译程序只需生成在 Java 虚拟机上运行的目…

2021-CISCN西南赛区线下-misc-stealer

stealer 题目描述: stealer 那女孩对我说说我是一个小偷(本题flag 格式为 DASCTF{},提交时只需要提交括号中间的字符。flag需小写) hint:MISC-stealer: focus on DNS CRYPTO 知识点 1.DNS后面的base64 2.然后base6…

CVPR 2019|PoolNet:基于池化技术的显著性检测 论文解读

作者 | 文永亮 研究方向 | 目标检测、GAN 研究动机 ​ 这是一篇发表于CVPR2019的关于显著性目标检测的paper,在U型结构的特征网络中,高层富含语义特征捕获的位置信息在自底向上的传播过程中可能会逐渐被稀释,另外卷积神经网络的感受野大小与深…

请问做亚马逊,注册P卡是用个人名义还是公司名义?

请问做亚马逊,注册P卡是用个人名义还是公司名义?亚马逊将Payoneer作为亚马逊卖家平台里的推荐收款方式。24个不同国家的卖家能够使用亚马逊卖家中心唯一推荐的收款方式——Payoneer来收款,接收、使用亚马逊货款变得前所未有地简便。 个人、公…

解决CentOS7 Ping不了外网的问题 ping:baidu.com: 未知的名称或服务

在CentOS7中遇到个问题,ping外网地址时候提示“未知的名称或服务” 先使用该命令查看路由网关信息 route -n 发现没有配置网关地址: ​​​​​​​ 去虚拟机里的虚拟网络编辑器里查看下网关地址 然后将网关地址配置到路由中 (临时有效&…

BUUCTF Web [GXYCTF2019]Ping Ping Ping

「作者主页」:士别三日wyx 此文章已录入专栏《网络攻防》,持续更新热门靶场的通关教程 「未知攻,焉知收」,在一个个孤独的夜晚,你完成了几百个攻防实验,回过头来才发现,已经击败了百分之九十九…

[GXYCTF 2019]Ping Ping Ping

前言 之前没总结过关于命令执行的绕过姿势,借着今天做的这个命令执行的题目来总结一下。 先看题目 题目 题目很单一,目的就是为了让我们通过参数传入内容来执行代码。因为题目是与ping有关,当我们输入127.0.0.1时,它会进行ping…

[GXYCTF2019]Ping Ping Ping(命令执行)

命令执行绕过 常见写法 127.0.0.1&&code 只有在 && 左边的命令返回真(命令返回值 $? 0),&& 右边的命令才 会被执行。 127.0.0.1&code &表示将任务置于后台执行 127.0.0.1||code 只有在 || 左边的命令返回…

CTF_Web_[GXYCTF2019]Ping Ping Ping

一、题目 Ping Ping Ping 二、靶机信息链接 靶机信息 剩余时间: 10072s http://70284b15-7c4e-4548-8b04-aadbc6e669f5.node4.buuoj.cn:81 三、靶机链接页面 四、 分析 因题目是Ping...再加上靶机页面有“/?ip” 可能是 ping地址,尝试按照所给的内容在url中加…

BUUCTF [GXYCTF2019]Ping Ping Ping easywill

题目地址:BUUCTF在线评测 考点:ping命令相关命令执行 这里过滤了flag和空格 绕过空格可以使用 $IFS$1 使用ls命令查询目录 ?ip127.0.0.1;ls 发现有两个文件,一个是flag.php,另一个是index.php。 cat获取文件内容&#xff…

BUUctf [GXYCTF2019]Ping Ping Ping

根据题目和页面的提示猜测是命令执行漏洞 ;前面和后面命令都要执行,无论前面真假 |直接执行后面的语句 ||如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句 &前面和后面命令都要执行,无论前面真假 &&如果前面为假&a…

BUUCTF——web([GXYCTF2019]Ping Ping Ping、[极客大挑战 2019]Knife、[极客大挑战 2019]Http)

BUUCTF-web [GXYCTF2019]Ping Ping Ping做题思路 [极客大挑战 2019]Knife做题思路 [极客大挑战 2019]Http做题思路 [GXYCTF2019]Ping Ping Ping 做题思路 打开看题目 熟悉的样子,ping本地加查看命令,得到两个php文件 接着查看一下文件内容 奇奇怪…

Buuctf (Web)Ping Ping Ping

文章目录 一.解题步骤二、命令分隔符三.常见绕过方式 一.解题步骤 (1)页面里显示/?ip,很明显要以ping的形式传一个参数给ip,并且我们要想执行其他命令,就要用命令分隔符也就是管道符连接,命令分隔符可以用";“”…

BUUCTF之Ping Ping Ping

目录 审题 常用的空格绕过方法 解决方法 法一 拼接绕过法 法二 内联执行法 法三 sh编码绕过法 审题 点开链接 根据题目提示随便试试构造payload inurl?ip666 有返回,参数ip的值就是要ping的内容 这里我们知道有Windows和Linux通用的…

BUUCTF【Web】Ping Ping Ping

进入靶场后是一个ping的功能(命令执行漏洞),参数ip传递的内容会被当做ip地址进行网络连通性测试。首先测试一下本机地址 首先使用ls命令查看当前路径下有那些文件,拼接符有“&”、“|”、“||”、“&&”、“&#xff…

BUUCTF Web [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http

目录 [GXYCTF2019]Ping Ping Ping [极客大挑战 2019]LoveSQL [极客大挑战 2019]Knife [极客大挑战 2019]Http [GXYCTF2019]Ping Ping Ping 启动靶机,构造payload ?ip127.0.0.1 查看同目录下有什么文件 ?ip127.0.0.1;ls 读取flag.php ?ip127.0.0.1;cat flag…