Kerberized YARN集群提交spark-shell报‘User not found’错误排查
看起来你遇到了一个有点矛盾的问题——明明datapass用户在Kerberos主体列表和HDFS用户目录里都存在,但YARN初始化AM容器时却报错说找不到这个用户。我之前处理过类似的Kerberos+YARN集群问题,通常是以下几个环节出了问题,你可以逐一排查:
1. YARN NodeManager节点缺失系统层面的datapass用户
YARN在启动容器的时候,会在NodeManager所在的机器上检查Linux/Unix系统是否存在对应用户——哪怕Kerberos和HDFS里有这个用户,只要NodeManager节点没创建系统用户,就会触发这个错误。
你可以登录所有运行NodeManager的机器,执行命令检查:
id datapass
如果返回id: datapass: no such user,说明需要在所有NodeManager节点创建该用户:
useradd datapass
注意:最好保证这个用户的UID在集群所有节点上一致,避免后续HDFS权限出现奇怪的问题。
2. Kerberos主体到系统用户的映射规则配置错误
Kerberos的主体名称(比如datapass@COMPUTE.INTERNAL)需要正确映射到系统用户名datapass,如果映射规则错了,YARN就识别不出来。
你需要检查两个关键配置:
krb5.conf:确认文件里的auth_to_local规则是否正确。比如针对你的域,应该有类似这样的规则:
这条规则会把[libdefaults] ... auth_to_local = RULE:[1:$1@$0](.*@COMPUTE.INTERNAL)s/@.*// auth_to_local = DEFAULTdatapass@COMPUTE.INTERNAL这类主体直接映射为系统用户datapass。container-executor.cfg:这个是YARN的Linux容器执行器配置文件,检查里面的allowed.users或allowed.groups是否包含datapass,确保YARN允许该用户启动容器。
3. Spark提交时的Kerberos身份不正确
你提交spark-shell时,当前的Kerberos票据是否属于datapass?可以用命令检查:
klist
如果当前票据是其他用户的,YARN会尝试用那个用户启动容器,自然会报错找不到datapass。这种情况下,你需要先重新获取正确的票据:
kinit datapass@COMPUTE.INTERNAL -kt /path/to/datapass.keytab
或者在提交spark-shell时直接指定主体和keytab:
spark-shell --principal datapass@COMPUTE.INTERNAL --keytab /path/to/datapass.keytab
4. Linux容器执行器的权限配置错误
YARN的linux-container-executor二进制文件需要特殊的SUID权限才能切换用户,如果权限不对,也会导致无法识别用户。你可以检查该文件的权限:
ls -l $HADOOP_HOME/bin/linux-container-executor
正确的权限应该类似:-rwsr-x--- 1 yarn hadoop ...,如果权限不符,需要重新设置:
chown yarn:hadoop $HADOOP_HOME/bin/linux-container-executor chmod 6050 $HADOOP_HOME/bin/linux-container-executor
内容的提问来源于stack exchange,提问作者tribbloid

