在 Yarn 的架构中,将集群中的计算资源,主要是内存和 CPU ,封装抽象出了 Container 的概念, 类似于 container_001 <memory:2048, vCores:1>
。 Container 由 ResourceManager 负责调度与分配,由资源所在的 NodeManager 负责启动与管理。
Container 所封装的计算资源是由集群中的 NodeManager 提供的,所以 Container 的启动,运行,监控, 管理也需要对应的 NodeManager 来执行。 ContainerExecutor 正是 NodeManager 用来启动与管理 Container 的工具。
Yarn 3.0 版本中,在 Linux 系统环境下,ContainerExecutor 有两种实现:
- DefaultContainerExecutor: 简称 DCE ,如其名,是默认的 ContainerExecutor 实现。 如果用户未指定 ContainerExecutor 的具体实现,NM 就会使用它。 DCE 直接使用 bash 来启动 container 进程,所有 container 都使用 NM 进程用户 (yarn) 启动。
- LinuxContainerExecutor: 简称 LCE,相比于 DCE ,它能提供更多有用的功能,如用户权限隔离,支持使用提交任务用户来启动 container;支持使用 cgroup 进行资源限制; 支持运行 docker container (合并了 2.x 版本中的 DockerContainerExecutor)。 LCE 使用可执行的二进制文件 container-executor 来启动 container 进程,container 的用户根据配置可以统一使用默认用户,也可以使用提交任务的用户(需要提前在 NM 上添加所有支持的用户)。
LCE 是安全的 ContainerExecutor。在默认的情况下,如果我们的集群是 non-secure ,而且没有什么特殊需求时,使用 DCE 就足够了,因为 DCE 配置和使用都很简单。但是当我们的集群要求安全性,比如开启了 kerberos 验证,我们就必须使用 LCE,使用 DCE 的话 MR 任务会在 reduce shuffle 阶段失败退出,参见YARN-1432。
配置
NM 具体使用哪种 ContainerExecutor 的实现由 yarn-site.xml 里的 yarn.nodemanager.container-executor.class
属性来配置。
DefaultContainerExecutor
DCE 的配置比较简单,只需要在 yarn-site.xml 指定 yarn.nodemanager.container-executor.class
属性为 org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor
即可,不需要额外的配置。
1 | <property> |
LinuxContainerExecutor
LCE 配置相对更加复杂一些, 具体如下:
1. yarn-site.xml 配置
1 |
|
2. container-executor.cfg 配置
container-executor.cfg 是 container-executor 二进制程序的配置文件,会在其启动时读取校验。
具体的属性如下:
- yarn.nodemanager.linux-container-executor.group: NM 的 Unix 用户组, 需要与 yarn-site.xml 里一致。
- allowed.system.users: 允许使用的系统用户,多个用户使用 ‘,’ 分隔,可以不设置,即允许所有用户。
- banned.users: 禁止使用的用户,多个用户使用 ‘,’ 分隔。
- min.user.id: 允许使用的用户的 uid 最小值,防止有其他超级用户。
配置样例如下:
1 | hadoop = |
启用
DCE 的启用不需要额外的操作,配置完成后直接重启 NM 即可。LCE 的启用则还需要一系列的准备工作。
1. 设置 container-executor 权限
container-executor 二进制的 owner 必须是 root,属组必须与 NM 属组相同 (hadoop),同时,它的权限必须设置成为 6050,以赋予它 setuid 的权限,来实现使用不同的用户来启动 container。
1 | chown root:hadoop /usr/lib/hadoop-yarn/bin/container-executor |
2. 设置 container-executor.cfg 权限
container-executor.cfg 二进制的 owner 必须是 root,属组必须与 NM 属组相同 (hadoop),同时,它的权限必须设置成为 0400, 以保证它是只读不可写的
1 | chown root:hadoop /etc/hadoop/conf/container-executor.cfg |
3. 设置 yarn-local 和 yarn-log dirs 权限
所有配置的 yarn-local 和 yarn-log 目录属主必须是 yarn:hadoop ,这个一般集群搭建时已经修改好了,不需要再处理。
4. 任务用户管理
在集群未开启 security authentication 时,也就是集群的用户校验方式为 hadoop.security.authentication=simple
时,如果开启用户限制yarn.nodemanager.linux-container-executor.nonsecure-mode.limit-users=false
,也就是说使用任务提交用户来运行其 container 时,则需要提前在集群所有的 NM 节点上将需要的用户通过 useradd 命令,逐个添加到机器上,否则任务运行时会因为找不到指定用户而失败。当集群规模比较大,用户很多时,添加用户还是比较繁琐的,也不好维护,所以以我们的实践经验来看,建议开启用户限制,统一使用 yarn 用户来启动 container。
不过当集群在 security 模式时,基本上就是开启kerberos 做权限验证时,只允许使用任务提交用户来启动 container,这时就比较苦逼的需要把 YARN 集群里的用户都添加到 NM 节点上才行。不过为了不这么麻烦,我对这块逻辑进行了修改,允许在安全下依然可以使用统一 yarn 用户来执行用户任务。具体实现方式可以查看YARN 在安全模式下使用统一用户运行 container。
当上述的操作都完成后,重启 NM , LCE 就会被启用。
注意事项
container-executor 和 container-executor.cfg 文件的权限一定要按照要求修改,否则 NM 会启动失败。如果改了权限后,NM 还是报权限问题,还需要将文件所在的目录用户组也改成 root:hadoop,权限改成 755。