理解和配置LinuxContainerExecutor

Posted by Keling Ma on 2018-01-29

最近在研究如何为Hadoop开启基于Kerberos的安全配置,经过千辛万苦配置好后本以为到了见证奇迹的时刻,但是卡在NodeManger无法启动,折磨的死去活来。经历了各种百度、google后依然无果,最终还是乖乖的回来细读Hadoop官方配置文档,竟然发现关于LinuxContainerExecutor配置的非常详细的讲解。为了不让学习的成果随记忆消散,因此在这儿总结并分享出来。

理解ContainerExector

Hadoop集群启用安全后,NodeManager无法启动的根本原因是LinuxContainerExecutor没有正确配置。ContainerExecutor 被Yarn框架使用,它定义了容器如何装载和控制。在Hadoop YARN中包含两种ContainerExecutor:

  • DefaultContainerExecutor: 这是默认的执行器,由Yarn用来管理容器执行。在该模式下容器进程使用和NodeManager相同的Unix用户运行容器。
  • LinuxContainerExecutor: 这个执行器仅在GNU/Linux上支持。在安全状态启用时,这个执行器以提交应用的YARN用户运行容器,在非安全状态时以特定用户执行(默认是nobody)。在安全状态启用时,这个执行器需要所有的用户账户在容器启动的集群节点被创建。它会用到包含在Hadoop部署包中的setuid可执行工具,NodeManager使用这个工具来启动和kill掉容器。为了最大化安全,executor安装限制本地文件和被容器使用目录(如共享对象,jars,中间文件,日志文件等等)的权限和用户/组所属权。特别需要注意的一点,正是因为此,除了应用所有者和NodeManager外,不该有其它用户能访问任何上述本地文件或目录

编译可执行文件

如果你的环境中安装了maven,那可以参照官方帮助中的编译方法:

1
mvn package -Dcontainer-executor.conf.dir=/etc/

参数-Dcontainer-executor.conf.dir传入的路径应该是集群节点上放置配置文件的路径,保证setuid可执行文件能定位到。可执行文件应该安装在$HADOOP_YARN_HOME/bin目录下。

为了方便大家使用,我在这里提供编译好的container-executor,配置文件路径指向/etc/container-executor.cfg, container-executor拷贝到Hadoop bin 目录下。

1
[root@hadoop01 bin]# cp container-executor /home/hadoop/hadoop-2.8/bin/

分配可执行文件权限

1
2
[root@hadoop01 bin]# chown root:hadoop /home/hadoop/hadoop-2.8/bin/container-executor 
[root@hadoop01 bin]# chmod 6050 /home/hadoop/hadoop-2.8/bin/container-executor

这里的组hadoop是NodeManager Unix用户(yarn)所属的组,并且组内没有非hadoop相关的用户,以防安全风险。这个组名需要在yarn-site.xml和container-executor.cfg中都配置,

配置yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<property>
<name>yarn.nodemanager.container-executor.class</name>
<value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.path</name>
<value>/home/hadoop/hadoop-2.8/bin/container-executor</value>
</property>
<property>
<name>yarn.nodemanager.linux-container-executor.group</name>
<value>hadoop</value>
</property>

分配本地目录权限

LinuxTaskController还需要在container-executor.cfg中配置的yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs路径被赋予755权限。设置如下:

1
2
3
4
5
6
[root@hadoop01 ~]# mkdir -p /hadoop/yarn/local
[root@hadoop01 ~]# mkdir -p /hadoop/yarn/log
[root@hadoop01 yarn]# chown yarn:hadoop /hadoop/yarn/local
[root@hadoop01 yarn]# chown yarn:hadoop /hadoop/yarn/log
[root@hadoop01 yarn]# chmod 755 /hadoop/yarn/local
[root@hadoop01 yarn]# chmod 755 /hadoop/yarn/log

配置container-executor.cfg文件

  • 为配置文件添加配置项

    1
    2
    3
    4
    5
    6
    [root@hadoop01 ~]# vim /home/hadoop/hadoop-2.8/etc/hadoop/container-executor.cfg 
    yarn.nodemanager.local-dirs=/hadoop/yarn/local
    yarn.nodemanager.log-dirs=/hadoop/yarn/log
    yarn.nodemanager.linux-container-executor.group=hadoop
    banned.users=hdfs,yarn,mapred,bin
    min.user.id=1000
  • 拷贝配置文件

    配置文件container-executor.cfg需要拷贝到之前编译可执行文件中指定的/etc/目录下,以便能被可执行文件访问到。

    1
    [root@hadoop01 ~]# cp /home/hadoop/hadoop-2.8/etc/hadoop/container-executor.cfg /etc/
  • 为配置文件设置权属并分配权限

    配置文件目录需要运行在root用户,hadoop组,并且赋予0400权限,配置如下:

    1
    2
    [root@hadoop01 ~]# chown root:hadoop /etc/container-executor.cfg
    [root@hadoop01 ~]# chmod 400 /etc/container-executor.cfg

必须如此配置,因为可执行程序逻辑会检测这些权限,否则NodeManager会启动失败。

最后,再总结下所有涉及目录的权限和权属分配表,以保证你做对了,任意一项都要严格遵守配置。

Filesystem Path User:Group Permissions
local container-executor root:hadoop --Sr-s--*
local conf/container-executor.cfg root:hadoop r-------*
local yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
local yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x

配置文件的坑

经过了上述审慎配置后,检查了无数遍,依然无法运行nodeManager,始终报如下错误:

Caused by: org.apache.hadoop.yarn.server.nodemanager.containermanager.linux.privileged.PrivilegedOperationException: ExitCodeException exitCode=24: Can’t get group information for hadoop - Success.

问题的原因是hadoop编码不够严谨,如果.cfg中group组配置中存在空格,就会始终报检测不到组的错误。这个解决方案借鉴了secfree的博客,文章写的非常赞,完美解决这个问题。

检测错误,运行:

1
2
[root@hadoop01 bin]# ./container-executor --checksetup
Can't get group information for hadoop - Success

修复错误:

1
2
3
4
5
6
7
8
[root@hadoop02 etc]# chmod 777 container-executor.cfg 
[root@hadoop02 etc]# vim container-executor.cfg
yarn.nodemanager.local-dirs=/hadoop/yarn/local
yarn.nodemanager.log-dirs=/hadoop/yarn/log
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred,bin
min.user.id=1000
[root@hadoop02 etc]# chmod 0400 container-executor.cfg

如果参照上述修改后,发现又有新错误出现,例如:

1
2
3
[root@hadoop03 etc]# /home/hadoop/hadoop-2.8/bin/container-executor --checksetup
configuration tokenization failed
Can't get configured value for yarn.nodemanager.linux-container-executor.group.

需要再回头检查.cfg文件的配置,可以通过cat命令检查:

1
2
3
4
5
6
7
[root@hadoop03 etc]# cat container-executor.cfg 
yarn.nodemanager.local-dirs=/hadoop/yarn/local
yarn.nodemanager.log-dirs=/hadoop/yarn/log
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred,bin
min.user.id=1000
~

可以看到在.cfg文件的末尾多了一个“~”号,这是导致错误的原因,重新修订.cfg文件,确保最后看到的结果如下:

1
2
3
4
5
6
[root@hadoop03 etc]# cat container-executor.cfg 
yarn.nodemanager.local-dirs=/hadoop/yarn/local
yarn.nodemanager.log-dirs=/hadoop/yarn/log
yarn.nodemanager.linux-container-executor.group=hadoop
banned.users=hdfs,yarn,mapred,bin
min.user.id=1000

参考资料: