当master是k8s时,Spark 2.4.4是否支持转发委托令牌?

时间:2019-12-04 11:57:32

标签: apache-spark kubernetes hdfs kerberos livy

我目前正在设置一个Kerberized环境,以便使用Kubernetes中的Livy提交Spark Jobs。

到目前为止我已经取得的成就:

  • 运行Kerberized HDFS群集
  • 使用SPNEGO的Livy
  • Livy向k8s提交作业并生成Spark执行者
  • KNIME能够从k8s集群外部与Namenode和Datanode进行交互

为此,我对所涉及的组件使用了以下版本:

  • 火花2.4.4
  • Livy 0.5.0(KNIME当前仅支持的版本)
  • Namenode和Datanode 2.8.1
  • Kubernetes 1.14.3

我目前正在努力解决的问题:

  • 从Spark执行者访问HDFS

尝试从执行程序访问HDFS时,我当前收到的错误消息如下:

org.apache.hadoop.security.AccessControlException: Client cannot authenticate via:[TOKEN, KERBEROS]; Host Details : local host is: "livy-session-0-1575455179568-exec-1/10.42.3.242"; destination host is: "hdfs-namenode-0.hdfs-namenode.hdfs.svc.cluster.local":8020;

以下是当前状态:

  1. 成功挑战KDC(使用Keytab + Principal)后,KNIME连接到HDFS->工作
  2. KNIME将暂存jar放入HDFS->工作
  3. KNIME向Livy请求新的会议(SPNEGO挑战)->工作中
  4. Livy与k8s大师/生成执行者提交Spark Job->工作
  5. KNIME将任务提交给Livy,这些任务应由执行者执行->基本正常工作
  6. 尝试访问HDFS读取文件时,出现前面提到的错误->问题

由于KNIME将jar文件放在必须包含在Spark Jobs依赖项中的HDFS上,因此能够访问HDFS非常重要。 (例如,KNIME要求它能够从数据集中检索预览数据)

我试图找到解决方案,但是不幸的是,尚未找到任何有用的资源。 我查看了选中的UserGroupInformation.getCurrentUser().getTokens()的代码。 但是那个集合似乎是空的。这就是为什么我认为没有可用的委托令牌的原因。

有人能做到这样的事情并且可以帮助我吗?

谢谢大家!

1 个答案:

答案 0 :(得分:2)

对于每个为此苦苦挣扎的人: 花了一段时间才找到为什么它不起作用的原因,但基本上它与Spark自2.4.4起的Kubernetes实现有关。 在fetchHadoopDelegationTokens中没有为CoarseGrainedSchedulerBackend的{​​{3}}定义替代。

已经有KubernetesClusterSchedulerBackend可以通过将秘密传递给包含委派令牌的执行者来解决此问题。 它已经被拉入master并可以在Spark 3.0.0-preview中使用,但至少在Spark 2.4分支中尚不可用。