多次修改CDH集群关联的Kerberos域后,Spark无法正常获得短名称映射的问题排查

环境

CDH 6.3.1
Oracle JDK 1.8.0_181
已开启Kerberos


症状表现

该集群曾经更换了关联的Kerberos域名称,由XY.COM.CN改为了XY.COM。
现在又重新进行了更换,由XY.COM重新改为了XY.COM.CN。


修改完成后,集群重启,Cloudera Manager(以下简称CM)显示一切正常。


但是在使用Spark的过程中,发现在非Kerberos服务端的节点,执行spark的命令行工具(包括spark-shell、spark-submit等),就直接报错。提示获取短名称的规则不存在:

[main] util.KerberosName(KerberosName.java:getShortName(401)) - No auth_to_local rules applied to cloudera-scm/[email protected] does not exist


解决过程

从报错信息来看,spark-shell仍然尝试用之前的Kerberos域名来进行短名称映射。
可以看到报错信息中,getShortName方法还是会去找Kerberos域“XY.COM”对应的解析规则;然而现在这个Kerberos域XY.COM实际已经不存在,现在的规则是对应XY.COM.CN的,所以自然无法对cloudera-scm/[email protected]应用有效的短名称规则。


CDH中,spark的命令行工具都是默认读取CM下发的配置文件,那么首先推测的情况,就有可能是集群关联的Kerberos域修改后,CM没有成功下发新的客户端配置。

尝试在CM界面刷新和重新部署各个服务的客户端。但是没有效果。还是会报同样的错误。


此时推断是CM本身在应对已经实施Kerberos安全的集群的Kerberos域修改时,下发客户端配置的部分存在一些问题,导致没有成功分发正确的配置文件。

那么我们必须找到一个能触发涉及Kerberos主体映射相关配置文件下发的选项,修改后重新进行下发,让正确的配置覆盖目前节点上的客户端配置文件。


打开CM,找到HDFS服务,找到配置项中的“将 Kerberos 主体映射到短名称的其他规则”。

该选项本来是留给不符合标准Kerberos命名方式的主体自定义短名称映射用的。正常情况下,只要是标准的Kerberos主体名称形式(例如hive/[email protected],或者[email protected]),这个选项的默认值“DEFAULT”就能正确拿到用户名(例如hive/[email protected]会被最终映射为短名称hive),不需要我们手工再指定。

因为HDFS是所有其他服务组件都要依赖的核心组件,我们通过这个选项的修改,肯定会触发所有涉及认证的服务的客户端部署。


填入自定义映射规则的内容,进行保存,这个自定义映射规则实际等同于“DEFAULT”的效果:

RULE:[1:$1@$0](.*@\XY.COM.CN)s/@\XY.COM.CN//
RULE:[2:$1@$0](.*@\XY.COM.CN)s/@\XY.COM.CN//

多次修改CDH集群关联的Kerberos域后,Spark无法正常获得短名称映射的问题排查_第1张图片
点击保存。提示重启服务,这时勾选上重新部署客户端

重启完成后,重新运行spark-shell,一切正常!问题解决。


总结

虽然CM之类的Hadoop集群服务管理系统能很方便的帮我们解决复杂的手工命令行配置,但是有些时候它本身还是会发生一些意想不到的问题。在这时我们就需要尝试刷新客户端配置;如果也没有办法生效,那就手工配置正确的项目内容,来触发CM对客户端配置的重新部署。

你可能感兴趣的:(大数据安全,CDH,Spark)