繁体   English   中英

处于集群 (YARN) 模式时 Spark 上的 Kerberos 问题

[英]Kerberos issue on Spark when in cluster (YARN) mode

我将 Spark 与 Kerberos 身份验证一起使用。

我可以使用spark-shell运行我的代码,我也可以在本地模式下使用spark-submit (例如—master local[16] )。 两者都按预期运行。

本地模式 -

spark-submit --class "graphx_sp" --master local[16] --driver-memory 20G target/scala-2.10/graphx_sp_2.10-1.0.jar

我现在正在使用 YARN 在集群模式下运行。

这里我可以看到您需要指定keytab的位置并指定principal 因此:

spark-submit --class "graphx_sp" --master yarn  --keytab /path/to/keytab --principal login_node  --deploy-mode cluster --executor-memory 13G --total-executor-cores 32 target/scala-2.10/graphx_sp_2.10-1.0.jar

但是,这将返回:

Exception in thread "main" java.io.IOException: Login failure for login_node from keytab /path/to/keytab: javax.security.auth.login.LoginException: Unable to obtain password from user

    at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:987)
    at org.apache.spark.deploy.SparkSubmit$.prepareSubmitEnvironment(SparkSubmit.scala:564)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:154)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Caused by: javax.security.auth.login.LoginException: Unable to obtain password from user

    at com.sun.security.auth.module.Krb5LoginModule.promptForPass(Krb5LoginModule.java:897)
    at com.sun.security.auth.module.Krb5LoginModule.attemptAuthentication(Krb5LoginModule.java:760)
    at com.sun.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:617)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:755)
    at javax.security.auth.login.LoginContext.access$000(LoginContext.java:195)
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:682)
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
    at javax.security.auth.login.LoginContext.login(LoginContext.java:587)
    at org.apache.hadoop.security.UserGroupInformation.loginUserFromKeytab(UserGroupInformation.java:978)
    ... 4 more

在使用 spark-shell 或在 spark-submit 中的本地模式下运行之前,我执行以下 kerberos 设置:

kinit -k -t ~/keytab -r 7d `whoami`

显然,此设置并未扩展到 YARN 设置。 如何在集群模式下使用 YARN 修复 Kerberos 问题? 这是否必须在我的 /src/main/scala/graphx_sp.scala 文件中?

更新

通过在详细模式下运行kinit -V -k -t ~/keytab -r 7d whoami 我能够看到 prinicpal 的形式为user@node

我更新了这个,检查了keytab的位置,事情成功地通过了这个检查点:

INFO security.UserGroupInformation: Login successful for user user@login_node using keytab file /path/to/keytab

但是,它随后无法通过以下方式发布:

client token: N/A
     diagnostics: User class threw exception: org.apache.hadoop.security.AccessControlException: Authentication required

我已经检查了 keytab 上的权限并且读取权限是正确的。 有人建议下一种可能性是密钥表损坏

我们发现当应用程序尝试从 HDFS 读取时,会发生Authentication required错误。 Scala 正在做惰性求值,所以它没有失败,直到它开始处理文件。 这从 HDFS 行读取: webhdfs://name:50070

因为,WEBHDFS定义了一个公共HTTP REST API允许访问,我还以为是使用acls ,但使ui.view.acls并没有解决问题。 添加--conf spark.yarn.access.namenodes=webhdfs://name:50070修复了问题。 这提供了逗号分隔的安全 HDFS 名称节点列表,Spark 应用程序将访问这些名称节点。 Spark 获取每个名称节点的安全令牌,以便应用程序可以访问这些远程 HDFS 集群。 这修复了需要身份验证的错误。

或者,直接访问 HDFS hdfs://file工作并使用 Kerberos 进行身份验证,并在spark-submit期间传递主体和密钥表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM