Spark 2.4.4 是否支持master为k8s时转发Delegation Tokens?
Does Spark 2.4.4 support forwarding Delegation Tokens when master is k8s?
我目前正在设置 Kerberized 环境,以便在 Kubernetes 中使用 Livy 提交 Spark 作业。
到目前为止我取得的成就:
- 运行 Kerberized HDFS 集群
- Livy 使用 SPNEGO
- Livy 将作业提交到 k8s 并生成 Spark 执行器
- KNIME 能够从 k8s 集群外部与 Namenode 和 Datanode 交互
为了实现这一点,我对所涉及的组件使用了以下版本:
- Spark 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;
以下是当前状态:
- KNIME 在成功挑战 KDC 后连接到 HDFS(使用 Keytab + Principal)--> Working
- KNIME 将 staging jar 放到 HDFS --> 工作中
- KNIME 向 Livy 请求新会话(SPNEGO 挑战)--> 工作中
- Livy 使用 k8s master/spawn executors 提交 Spark Job --> Working
- KNIME 将任务提交给 Livy,应该由执行者执行 --> 基本工作
- 访问HDFS读取文件时出现上述错误 --> 问题所在
由于 KNIME 将 jar 文件放置在 HDFS 上,这些文件必须包含在 Spark 作业的依赖项中,因此能够访问 HDFS 非常重要。 (例如,KNIME 要求它能够从数据集中检索预览数据)
我试图找到解决这个问题的方法,但不幸的是,还没有找到任何有用的资源。
我查看了代码并检查了 UserGroupInformation.getCurrentUser().getTokens()
。
但是那个集合似乎是空的。这就是为什么我假设没有可用的委托令牌。
有没有人实现过 运行 这样的事情并且可以帮助我?
提前谢谢大家!
致所有为此苦苦挣扎的人:
花了一段时间才找到为什么这不起作用的原因,但基本上它与 2.4.4 的 Spark Kubernetes 实现有关。
没有为 CoarseGrainedSchedulerBackend
的 fetchHadoopDelegationTokens
in KubernetesClusterSchedulerBackend
.
定义覆盖
已经有 pull request 可以通过将秘密传递给包含委托令牌的执行者来解决这个问题。
它已经被拉入 master 并在 Spark 3.0.0-preview 中可用,但至少在 Spark 2.4 分支中不可用。
我目前正在设置 Kerberized 环境,以便在 Kubernetes 中使用 Livy 提交 Spark 作业。
到目前为止我取得的成就:
- 运行 Kerberized HDFS 集群
- Livy 使用 SPNEGO
- Livy 将作业提交到 k8s 并生成 Spark 执行器
- KNIME 能够从 k8s 集群外部与 Namenode 和 Datanode 交互
为了实现这一点,我对所涉及的组件使用了以下版本:
- Spark 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;
以下是当前状态:
- KNIME 在成功挑战 KDC 后连接到 HDFS(使用 Keytab + Principal)--> Working
- KNIME 将 staging jar 放到 HDFS --> 工作中
- KNIME 向 Livy 请求新会话(SPNEGO 挑战)--> 工作中
- Livy 使用 k8s master/spawn executors 提交 Spark Job --> Working
- KNIME 将任务提交给 Livy,应该由执行者执行 --> 基本工作
- 访问HDFS读取文件时出现上述错误 --> 问题所在
由于 KNIME 将 jar 文件放置在 HDFS 上,这些文件必须包含在 Spark 作业的依赖项中,因此能够访问 HDFS 非常重要。 (例如,KNIME 要求它能够从数据集中检索预览数据)
我试图找到解决这个问题的方法,但不幸的是,还没有找到任何有用的资源。
我查看了代码并检查了 UserGroupInformation.getCurrentUser().getTokens()
。
但是那个集合似乎是空的。这就是为什么我假设没有可用的委托令牌。
有没有人实现过 运行 这样的事情并且可以帮助我?
提前谢谢大家!
致所有为此苦苦挣扎的人:
花了一段时间才找到为什么这不起作用的原因,但基本上它与 2.4.4 的 Spark Kubernetes 实现有关。
没有为 CoarseGrainedSchedulerBackend
的 fetchHadoopDelegationTokens
in KubernetesClusterSchedulerBackend
.
已经有 pull request 可以通过将秘密传递给包含委托令牌的执行者来解决这个问题。 它已经被拉入 master 并在 Spark 3.0.0-preview 中可用,但至少在 Spark 2.4 分支中不可用。