在群集(YARN)模式下,Spark上的Kerberos问题

问题描述 投票:2回答:1

我正在使用带有Kerberos身份验证的Spark。

我可以使用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以群集模式运行。

here开始,我看到您需要指定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,我能够看到主教的形式为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

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

scala apache-spark yarn kerberos
1个回答
1
投票

[我们发现,当应用程序尝试从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期间传递了主体和密钥表。


0
投票

或者,直接访问HDFS hdfs:// file可以使用Kerberos进行工作和身份验证,并且在spark-submit期间将传递主体和密钥表。这是什么意思?另外,我是否需要更新core-site.xml文件以启用身份验证感到困惑?或只创建keytab文件和主体并在spark-submit中传递它们。请我需要帮助。

© www.soinside.com 2019 - 2024. All rights reserved.