YARN环境Spark作业连接Kerberos+SSL Solr时校验和失败求助
排查Spark Driver连接Kerberos+SSL Solr集群时GSSException校验和失败的方向
看起来你遇到了一个挺棘手的问题——本地测试客户端能正常连接Kerberos+SSL的Solr 6集群,但一放到Spark Driver里就抛出GSSException(校验和失败)的403错误。既然你已经排查了反向DNS、Java无限制加密包这些基础项,那咱们从Spark与Kerberos集成的特殊场景入手,给你几个具体的排查方向:
1. 检查Spark Driver的Kerberos票证上下文差异
本地测试客户端用的是你当前登录用户的Kerberos票证(比如krb5cc_<uid>),但Spark Driver在YARN集群模式下运行时,使用的是作业提交时指定的principal/keytab对应的票证,两者的上下文可能完全不同:
- 确认作业提交时是否正确指定了
spark.yarn.principal和spark.yarn.keytab参数,Driver容器能否通过这些参数获取有效的Kerberos票证; - 若能进入Driver容器,执行
klist命令查看票证的有效期、关联的principal是否正确; - 若作业运行时间较长,检查是否配置了票证自动刷新(比如
spark.security.credentials.renewalTime参数),避免票证过期导致认证失败。
2. 核对Spark Driver与测试客户端的Kerberos/SSL配置一致性
测试客户端的JVM参数和Spark Driver的配置可能存在差异,必须确保两者的核心配置完全一致:
- 在
spark.driver.extraJavaOptions中显式指定Kerberos配置文件路径:-Djava.security.krb5.conf=/path/to/krb5.conf,避免Driver使用系统默认的、可能不一致的配置; - 同步SSL相关参数:将测试客户端使用的truststore路径、密码、协议等配置,通过
spark.driver.extraJavaOptions传递给Driver,比如:--driver-java-options "-Djavax.net.ssl.trustStore=/path/to/truststore.jks -Djavax.net.ssl.trustStorePassword=your_password" - 验证Driver的JVM是否真的加载了无限制加密包:检查Driver所在JVM的
jre/lib/security目录,确认US_export_policy.jar和local_policy.jar是无限制版本,或在Driver日志中搜索加密算法相关的受限提示。
3. 深入排查Kerberos加密算法与SPN匹配问题
校验和失败通常和客户端与服务端的加密算法不匹配直接相关,即使安装了无限制加密包,仍需确认:
- 查看
krb5.conf中的default_tkt_enctypes、default_tgs_enctypes配置,确保客户端与Solr服务端使用的加密算法完全一致(比如都包含aes256-cts-hmac-sha1-96); - 再次确认Solr的SPN格式:必须是
solr/<fully.qualified.domain.name>@REALM,Spark Driver连接时使用的主机名必须是该FQDN,不能用IP或短域名;可以通过开启Kerberos调试日志,查看Driver请求的SPN是否与Solr服务端的SPN匹配; - 若Solr前端有负载均衡器,需确认负载均衡器是否正确传递客户端的SPN,或自身使用正确的SPN与Solr通信。
4. 对比成功与失败的Kerberos协商日志
你已经有成功和失败的堆栈,现在可以通过开启详细调试日志定位差异:
- 在Spark提交命令中添加
--driver-java-options "-Dsun.security.krb5.debug=true",让Driver输出Kerberos协商的完整日志; - 将这份日志与本地测试客户端的Kerberos调试日志(同样开启
-Dsun.security.krb5.debug=true)对比,重点关注:- 票证请求的SPN是否一致;
- 使用的加密算法、密钥版本号(kvno)是否匹配;
- 协商过程中是否有步骤差异(比如测试客户端能获取有效TGS票证,而Driver获取的票证存在问题)。
5. 检查YARN容器的环境与权限差异
Spark Driver运行在YARN容器中,环境与本地客户端可能存在差异:
- 确认YARN容器的
KRB5_CONFIG环境变量是否指向正确的配置文件,避免容器使用默认的错误配置; - 检查Driver运行的用户是否与测试客户端的用户一致,若不一致,需确认该用户是否被Solr的ACL配置允许访问;
- 验证YARN节点的JVM版本与本地测试客户端的JVM版本一致,不同版本的JVM对Kerberos的处理可能存在差异。
6. 查看Solr服务端的认证日志
虽然普通客户端能正常访问,但Spark Driver的请求可能有不同特征,查看Solr的Kerberos认证日志(或KDC的日志),定位服务端拒绝请求的具体原因:
- 日志中是否有
BAD_INTEGRITY、KDC_ERR_PREAUTH_FAILED等明确错误码? - 是否提示加密算法不支持、票证无效或校验和计算错误?这些信息能精准缩小排查范围。
内容的提问来源于stack exchange,提问作者avinash patil
相关产品推荐
相关产品推荐

