【问题标题】:Why am I not able to run sparkPi example on a Kubernetes (K8s) cluster?为什么我无法在 Kubernetes (K8s) 集群上运行 sparkPi 示例?
【发布时间】:2020-05-02 20:18:57
【问题描述】:

到目前为止,我已经在 VMWare Workstation 内的虚拟机上启动并运行了一个 K8s 集群。我正在尝试使用来自here 的官方文档本地部署 Spark 应用程序。不过,我也登陆了this 文章,感觉更清楚了。

现在,早些时候我的设置是在嵌套虚拟机中运行的,基本上我的机器在 Win10 上,并且我有一个 Ubuntu 虚拟机,其中我还有 3 个虚拟机为集群运行(我知道这不是最好的主意)。

当我尝试按照提到的文章运行我的设置时,我首先在集群内创建了一个名为 spark 的服务帐户,然后创建了一个名为 spark-roleclusterrolebinding,将 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


【解决方案1】:

确保您部署的 kubernetes 版本与您使用的 Spark 版本兼容。

Apache Spark 使用 Kubernetes 客户端库与 Kubernetes 集群通信。

截至今天,最新的 LTS Spark 版本是 2.4.5,其中包括 kubernetes 客户端版本 4.6.3。

检查 Kubernetes 客户端的兼容性矩阵here

支持的 kubernetes 版本一直到 v1.17.0。

根据我的个人经验Apache Spark 2.4.5 与 kubernetes v1.15.3 版本配合得很好。我在使用较新的版本时遇到了问题。

当使用不支持的 kubernetes 版本时,获取的日志与您描述的一样:

Caused by: java.net.SocketException: Broken pipe (Write failed) or,
Caused by: okhttp3.internal.http2.ConnectionShutdownException

【讨论】:

  • 是的,正如前面@AliaksandrSasnouskikh 的评论中提到的,正是这个问题。将我的 K8s 版本从 v1.17.4 降级到 v1.15.3 为我完成了这项工作。谢谢。
【解决方案2】:

面临与 v1.18.0 完全相同的问题,将版本降级到 v1.15.3 使其工作

minikube 启动 --cpus=4 --memory=4048 --kubernetes-version v1.15.3

【讨论】:

    【解决方案3】:

    K8s 上的 Spark 运算符示例使用有效的 Spark 图像(来自gcr.io)。可以在spark-on-k8s-operator/examples/spark-pi.yaml中找到图片标签

    spec:
      ...
      image: "gcr.io/spark-operator/spark:v2.4.5"
    ...
    

    我尝试替换 bin/spark-submit 中的 image 配置,它对我有用。

    bin/spark-submit \
    --master k8s://https://192.168.99.100:8443 \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.driver.cores=1 \
    --conf spark.driver.memory=512m \
    --conf spark.executor.instances=2 \
    --conf spark.executor.memory=512m \
    --conf spark.executor.cores=1 \
    --conf spark.kubernetes.container.image=gcr.io/spark-operator/spark:v2.4.5 \
    --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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2019-07-25
      • 1970-01-01
      • 2018-05-04
      • 2014-08-25
      相关资源
      最近更新 更多