Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 处于群集(纱线)模式时Spark上的Kerberos问题_Scala_Apache Spark_Yarn_Kerberos - Fatal编程技术网

Scala 处于群集(纱线)模式时Spark上的Kerberos问题

Scala 处于群集(纱线)模式时Spark上的Kerberos问题,scala,apache-spark,yarn,kerberos,Scala,Apache Spark,Yarn,Kerberos,我将Spark与Kerberos身份验证一起使用 我可以使用spark shellfine运行代码,也可以在本地模式下使用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 我现在正在使用纱线以群集模式运行 从中可以看

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

我可以使用
spark shell
fine运行代码,也可以在本地模式下使用
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
我现在正在使用纱线以群集模式运行

从中可以看出,您需要指定
键选项卡的位置
,并指定
主体
。因此:

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`
显然,这种设置并没有扩展到纱线设置。如何解决群集模式下的Kerberos问题?这是我的/src/main/scala/graphx_sp.scala文件中必须包含的内容吗

更新 通过在详细模式下运行
kinit-V-k-t~/keytab-r7d
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读取时,会发生required
错误。 Scala在做惰性评估,所以直到它开始时才失败 正在处理文件。这是从HDFS行读取的:
webhdfs://name:50070

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


或者,直接访问HDFS
hdfs://file
使用Kerberos进行工作和身份验证,在spark submit期间传递principal和keytab的情况下

检查您用于这些的实际值:--keytab/path/to/keytab--principal login\u nodeThanks@THeron。如何检查这些值?我知道键表路径是正确的。我假设内容是正确的,因为我可以登录。我将主体设置为我登录的节点,并从中发出此命令。作为一次性测试,您应该首先尝试通过使用Kerberos票证来验证keytab。我一直想对此进行说明并将其发布到web。我会给你发一个链接,“主体”的语法应该是
user@REALM
,而
kinit
通过附加默认领域帮了你一个忙。但Hadoop不会。因此,运行
klist-k/path/to/keytab
来检查您的keytab所涉及的确切主体是什么。并在Spark命令行中使用该命令。或者,直接访问HDFShdfs://file 使用Kerberos进行工作和身份验证,在spark提交期间传递主体和密钥表。这是什么意思