apache-spark - 当master是k8s时,Spark 2.4.4是否支持转发Delegation Tokens?
问题描述
我目前正在设置一个 Kerberized 环境,以便在 Kubernetes 中使用 Livy 提交 Spark 作业。
到目前为止我所取得的成就:
- 运行 Kerberized HDFS 集群
- 使用 SPNEGO 的 Livy
- Livy 向 k8s 提交作业并生成 Spark 执行器
- KNIME 能够与 k8s 集群外部的 Namenode 和 Datanodes 交互
为了实现这一点,我为所涉及的组件使用了以下版本:
- 火花 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;
以下是当前状态:
- KNIME 在成功挑战 KDC(使用 Keytab + Principal)后连接到 HDFS --> 工作
- KNIME 将 staging jar 放到 HDFS --> 工作
- KNIME 向 Livy 请求新会话(SPNEGO 挑战)--> 工作中
- Livy 使用 k8s master 提交 Spark Job / spawns executors --> Working
- KNIME 向 Livy 提交任务,这些任务应该由执行者执行 --> 基本上可以工作
- 尝试访问 HDFS 以读取文件时出现前面提到的错误 --> 问题
由于 KNIME 将 jar 文件放在 HDFS 上,这些文件必须包含在 Spark 作业的依赖项中,因此能够访问 HDFS 很重要。(例如,KNIME 要求它能够从 DataSet 中检索预览数据)
我试图找到解决方案,但不幸的是,还没有找到任何有用的资源。我查看了检查过的代码UserGroupInformation.getCurrentUser().getTokens()
。但那个收藏似乎是空的。这就是为什么我认为没有可用的委托令牌。
有没有人曾经实现过这样的运行并且可以帮助我解决这个问题?
谢谢大家!
解决方案
对于每个为此苦苦挣扎的人:花了一段时间才找到为什么这不起作用的原因,但基本上它与 Spark 的 Kubernetes 2.4.4 实现有关。没有为CoarseGrainedSchedulerBackend
's fetchHadoopDelegationTokens
in定义覆盖KubernetesClusterSchedulerBackend
。
有一个拉取请求将通过将秘密传递给包含委托令牌的执行者来解决这个问题。它已经被拉入 master 并在 Spark 3.0.0-preview 中可用,但在 Spark 2.4 分支中不可用,至少目前还没有。
推荐阅读
- python - 在 For 循环中的 Python 中的赋值错误之前引用
- javascript - 错误:配置属性“db”未定义'Node.Js
- c# - C# not able to upload file
- c++ - 查找和打印不同字符串中的常见字母
- sql - 邮递员中的输入数据无效!Postman 测试 API asp.net core
- python - 如何在python中验证时间
- r - 加入后使用 tidyeval 列
- react-native - 在 FlatList 中放置一个 react-native-video 然后按一个按钮进入全屏
- mongodb - MongoError:不是主人:nodejs
- python - Python 调试器将退格转换为 `^H`