Kerberos 身份验证与 Hadoop 集群,来自在 Kubernetes 集群上运行的 Spark 独立集群



我已经在 Kubernetes 上设置了 Spark Standalone 集群,我正在尝试连接到不在 Kubernetes 上的 Kerberized Hadoop 集群。我已经将核心站点.xml和hdfs站点.xml放在Spark集群的容器中,并相应地设置了HADOOP_CONF_DIR。我能够在访问 Hadoop 集群的主体的 Spark 容器中成功生成 kerberos 凭据缓存。但是当我运行 spark-submit 时,它失败了,并在 worker 中出现以下访问控制异常。注意 -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

是否需要设置任何配置才能使辅助角色在 Spark 独立模式下使用凭据缓存?

您遇到了一个巨大的问题:AFAIK Spark Standalone 不处理任何类型的身份验证。

  • local模式下,Spark 客户端/驱动程序/执行器都位于同一个 JVM 中,Hadoop 客户端库可以直接访问本地缓存中存在的 Kerberos 票证(因此 Spark 不必管理任何东西(
  • yarn-cluster模式下,Spark 客户端使用本地 Kerberos 票证连接到 Hadoop 服务并检索特殊的身份验证令牌,然后将这些令牌传送到运行驱动程序的 YARN 容器;然后驱动程序将令牌广播给执行程序
  • yarn-client模式下,它类似于快捷方式,因为 Spark 驱动程序与客户端一起运行并且令牌已经可用
  • 使用Spark Independent,你就完蛋了。

有关 Kerberos 身份验证到 Hive 或 Spark 在yarn-*模式下的 HBase 的更多详细信息,请参阅 https://stackoverflow.com/a/44290544/5162372。

另请参阅长时间运行的作业(例如流式处理(所需的--principal--keytab参数,这些作业需要从驱动程序中即时更新其 Kerberos 信条(因为 Spark 客户端可能在启动后立即终止(


也许你可以尝试spark.yarn.access.namenodes看看这是否会迫使Spark客户端获取"额外的"Kerberos令牌,但我不会打赌,因为在Spark Independent模式下可能会忽略该属性。

参见Steve Loughran关于在不安全的YARN集群中运行Spark时访问安全Hive的评论

最新更新