Spark 2.4.4 是否支持在主节点为 k8s 时转发委派令牌?



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

到目前为止,我所取得的成就:

  • 运行 Kerberized HDFS 集群
  • Livy using SPNEGO
  • Livy 向 k8s 提交作业并生成 Spark 执行器
  • KNIME 能够与 k8s 集群外部的 Namenode 和数据节点进行交互

为了实现这一点,我对所涉及的组件使用了以下版本:

  • 火花 2.4.4
  • Livy 0.5.0(目前KNIME唯一支持的版本(
  • 名称节点和数据节点 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. KNIME 在成功挑战 KDC 后连接到 HDFS(使用 Keytab + Principal( --> 工作
  2. KNIME 将暂存罐放入 HDFS -->工作
  3. KNIME向Livy请求新的会话(SPNEGO挑战(-->工作
  4. Livy 使用 k8s master 提交 Spark Job/生成执行器 --> 工作
  5. KNIME 将任务提交给 Livy,这些任务应该由执行者执行 --> 基本工作
  6. 当尝试访问HDFS以读取文件时,会发生前面提到的错误-->问题

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

我试图找到解决方案,但不幸的是,还没有找到任何有用的资源。 我看了一下代码并检查了UserGroupInformation.getCurrentUser().getTokens(). 但那个集合似乎是空的。这就是为什么我假设没有可用的委派令牌。

有没有人曾经实现过这样的事情,可以帮助我解决这个问题?

提前谢谢大家!

对于每个挣扎的人: 花了一段时间才找到为什么这不起作用的原因,但基本上它与 Spark 的 Kubernetes 实现有关,从 2.4.4 开始。KubernetesClusterSchedulerBackend中没有为CoarseGrainedSchedulerBackendfetchHadoopDelegationTokens定义覆盖。

已经有一个拉取请求,它将通过将机密传递给包含委托令牌的执行程序来解决此问题。 它已经被拉入master,在Spark 3.0.0-preview中可用,但至少在Spark 2.4分支中不可用。

最新更新