我已经在 Kubernetes 上设置了 Spark Standalone 集群,并且正在尝试连接到不在 Kubernetes 上的 Kerberized Hadoop 集群。我已将 core-site.xml 和 hdfs-site.xml 放入 Spark 集群的容器中,并相应地设置了 HADOOP_CONF_DIR。我能够在 Spark 容器中为访问 Hadoop 集群的主体成功生成 kerberos 凭证缓存。但是当我运行spark-submit时,它失败并出现以下访问控制异常。 注意 - master 和worker 在单独的 Kubernetes pod 中运行。
spark-submit --master spark://master-svc:7077 --class myMainClass myApp.jar
Client cannot authenticate via: [TOKEN, KERBEROS]
但是,当我在本地模式下从 Spark 容器运行 Spark-submit 时,它能够成功与 Hadoop 集群通信。
spark-submit --master local[*] --class myMainClass myApp.jar
是否需要设置任何配置才能使 Worker 在 Spark Stand alone 模式下使用凭证缓存?
最佳答案
您遇到了一个大问题:据我所知 Spark Standalone 不处理任何类型的身份验证。
- 在
本地
模式下,Spark客户端/驱动程序/执行器都位于同一个JVM中,Hadoop客户端库可以直接访问本地缓存中存在的Kerberos票证(因此Spark没有管理任何事情) - 在
yarn-cluster
模式下,Spark 客户端使用本地 Kerberos 票证连接到 Hadoop 服务并检索特殊的身份验证 token ,然后将其发送到运行的 YARN 容器司机;然后驱动程序将 token 广播给执行程序 - 在
yarn-client
模式下,它与快捷方式类似,因为 Spark 驱动程序与客户端一起运行并且 token 已可用 - 有了 Spark Standalone,你就完蛋了。
比照。 https://stackoverflow.com/a/44290544/5162372有关在 yarn-*
模式下从 Spark 对 Hive 或 HBase 进行 Kerberos 身份验证的更多详细信息。
比照。还有长时间运行的作业(例如流媒体)所需的 --principal
和 --keytab
参数,这些作业需要从内部即时更新其 Kerberos 凭据驱动程序(因为 Spark 客户端可能在启动后立即终止)
也许你可以尝试 spark.yarn.access.namenodes
看看这是否会强制 Spark 客户端获取“额外的”Kerberos token ,但我不会打赌,因为该属性可能会在 Spark Standalone 模式下被忽略。
比照。 Steve Loughran 在 Access a secured Hive when running Spark in an unsecured YARN cluster 上的评论
关于apache-spark - 从运行在 Kubernetes 集群上的 Spark 独立集群对 Hadoop 集群进行 Kerberos 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61736734/