【发布时间】:2020-05-02 20:18:57
【问题描述】:
到目前为止,我已经在 VMWare Workstation 内的虚拟机上启动并运行了一个 K8s 集群。我正在尝试使用来自here 的官方文档本地部署 Spark 应用程序。不过,我也登陆了this 文章,感觉更清楚了。
现在,早些时候我的设置是在嵌套虚拟机中运行的,基本上我的机器在 Win10 上,并且我有一个 Ubuntu 虚拟机,其中我还有 3 个虚拟机为集群运行(我知道这不是最好的主意)。
当我尝试按照提到的文章运行我的设置时,我首先在集群内创建了一个名为 spark 的服务帐户,然后创建了一个名为 spark-role 的 clusterrolebinding,将 edit 作为集群角色并分配到spark服务账号,这样Spark driver pod就有足够的权限了。
然后我尝试使用此命令行运行示例 SparkPi 作业:
bin/spark-submit \
--master k8s://https://<k8-cluster-ip>:<k8-cluster-port> \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=2 \
--conf spark.kubernetes.container.image=kmaster:5000/spark:latest \
--conf spark.kubernetes.container.image.pullPolicy=IfNotPresent \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
local:///opt/spark/examples/jars/spark-examples_2.11-2.4.5.jar 100
它在创建 driver-pod 后几秒钟内失败,进入 Running 状态,大约 3 秒后进入 Error 状态。
在给出命令时kubectl logs spark-pi-driver this 是我得到的日志。
第二个Caused by: 总是如上所述,即:
-
Caused by: java.net.SocketException: Broken pipe (Write failed)或者, Caused by: okhttp3.internal.http2.ConnectionShutdownException
Log #2 供参考。
在遇到此问题后,我尝试提供--deploy-mode client 以查看它是否有所作为并获得更详细的日志。您可以从here 阅读客户端和集群模式之间的区别。
在将作业部署为 客户端模式 时它仍然失败,但是,现在我看到每次驱动程序 pod(现在不是作为 pod 而是作为本地计算机上的进程运行)尝试创建一个 executor pod,它会进入一个无限循环,试图创建一个 executor pod,并在 pod 名称后附加一个计数编号,因为最后一个进入终止状态。此外,现在我可以在 4040 端口上看到 Spark UI,但该作业无法继续进行,因为它甚至无法创建单个执行程序 pod。
我收到this 日志。
对我来说,这很明显可能是资源紧缩?
所以可以肯定的是,我删除了嵌套的虚拟机并在我的主机上设置了 2 个新的虚拟机,并使用 NAT 网络连接它们并设置相同的 K8s 集群。
但是现在,当我尝试做完全相同的事情时,它会失败并出现相同的错误(Broken Pipe/ShutdownException),但现在它告诉我即使在创建驱动程序 pod 时它也会失败。
This是日志供参考。
现在我什至无法获取关于它失败原因的日志,因为它甚至从未被创建。
我对此感到头疼,不知道为什么会失败。现在,我尝试了很多方法来排除它们,但到目前为止,除了一个(这是一个完全不同的解决方案)之外,没有任何效果。
我从here 尝试了来自 GCP 的 spark-on-k8-operator,它对我工作。我无法看到 Spark UI,因为它短暂运行,但它会在 shell 窗口中打印 Pi 值,所以我知道它可以工作。 我猜,即使这个 spark-on-k8s-operator '内部'做同样的事情,但我真的需要能够在本地部署它,或者至少知道它为什么会失败。
这里的任何帮助将不胜感激(我知道这是一个很长的帖子)。谢谢。
【问题讨论】:
-
jdk8 的 okhttp 中似乎有一个错误,我们已经升级了 okhttp 并修复了 github.com/fabric8io/kubernetes-client/pull/2176 。我们将在下周尽快发布。对造成的不便深表歉意
-
这个问题也可能是你的k8s集群的fabric8 Kubernetes客户端和Kubernetes API不兼容造成的。请参考this答案。
-
@RohanKumar 我看到一个带有修复的版本发布了 4.10.0。我更新了 Spark 中的依赖项,但
Broken pipe仍然存在 -
@RohanKumar 是的,我已将我的 open-jdk-8 版本降级到 252 之前的版本,甚至无法创建驱动程序 pod 的错误消失了,但 ShutdownException 仍然存在,现在有了“类型 [pod] 的操作 [get] 失败。
-
但是,@AliaksandrSasnouskikh 的评论有所帮助。我在 K8s v1.17.4 上。降级到 v1.15.3 为我完成了这项工作!这是一个兼容性问题。谢谢!
标签: apache-spark kubernetes rbac kubernetes-pod