Spark Java应用YARN集群模式下Impala JDBC Kerberos登录问题求助
解决Spark YARN集群模式下Kerberos认证无限等待密码的问题
我之前帮用户排查过类似的场景:你的Spark Java应用在Kerberos认证的Cloudera集群本地运行正常,但提交到YARN集群模式时就卡在Kerberos密码输入环节,根本没法自动完成认证。结合你的尝试(已经在spark-submit里加了--files),我整理了几个关键的解决步骤,应该能帮你搞定:
1. 确保Kerberos凭证和配置文件正确分发到YARN容器
本地运行时,你的应用直接使用了当前机器上的krb5.conf和用户keytab文件,但YARN集群模式下,这些文件需要被分发到每个执行容器中,同时还要告诉Spark如何用这些文件完成自动认证:
- 在spark-submit命令中,把
krb5.conf和你的用户keytab文件通过--files参数传递:--files /etc/krb5.conf,/path/to/your/user.keytab - 同时添加Spark配置参数,指定驱动和执行器的Kerberos配置路径,以及YARN的认证主体和keytab:
这里的--conf spark.driver.extraJavaOptions="-Djava.security.krb5.conf=./krb5.conf" \ --conf spark.executor.extraJavaOptions="-Djava.security.krb5.conf=./krb5.conf" \ --conf spark.yarn.principal=your_user@YOUR_REALM.COM \ --conf spark.yarn.keytab=./user.keytab./是因为--files会把文件放到每个容器的工作目录下,所以用相对路径就能访问到。
2. 检查Impala JDBC驱动的Kerberos参数配置
你的应用用Impala JDBC执行查询,必须确保JDBC URL里包含正确的Kerberos认证参数,否则容器里的JDBC驱动还是会尝试交互式输入密码:
String impalaJdbcUrl = "jdbc:impala://your-impala-host:21050/default;AuthMech=1;KrbRealm=YOUR_REALM.COM;KrbHostFQDN=your-impala-host;KrbServiceName=impala";
AuthMech=1明确指定使用Kerberos认证KrbRealm要和你的集群Kerberos realm一致KrbHostFQDN是Impala服务的主机名KrbServiceName是Impala的Kerberos服务名(通常是impala)
3. 验证YARN容器的Kerberos环境是否正常
如果还是有问题,可以在你的Spark应用里加一些调试代码,打印容器里的Kerberos相关信息,确认文件是否正确加载:
// 打印krb5.conf的路径 System.out.println("Current krb5.conf path: " + System.getProperty("java.security.krb5.conf")); // 打印Kerberos凭证缓存路径 System.out.println("KRB5CCNAME environment variable: " + System.getenv("KRB5CCNAME"));
另外,也可以通过YARN的Web UI查看容器的日志,搜索Kerberos相关的报错信息,比如是否有No valid credentials provided这类提示,帮助定位问题。
4. 确保文件权限和用户权限正确
- 你的用户keytab文件权限不能太开放,建议设置为
chmod 600 user.keytab,避免其他用户读取 - 执行spark-submit的用户需要有访问YARN集群、Impala服务的权限,并且keytab对应的主体有足够的权限执行Impala查询
完整的spark-submit命令示例
把上面的配置整合起来,你的spark-submit命令应该类似这样:
spark-submit --verbose \ --master yarn-cluster \ --files /etc/krb5.conf,/home/your-user/your-user.keytab \ --conf spark.driver.extraJavaOptions="-Djava.security.krb5.conf=./krb5.conf" \ --conf spark.executor.extraJavaOptions="-Djava.security.krb5.conf=./krb5.conf" \ --conf spark.yarn.principal=your-user@YOUR_REALM.COM \ --conf spark.yarn.keytab=./your-user.keytab \ --class com.your.package.YourSparkApplication \ /path/to/your/spark-app.jar
内容的提问来源于stack exchange,提问作者aloplop85
相关产品推荐
相关产品推荐

