为什么我无法在 Kubernetes (K8s) 集群上 运行 sparkPi 示例?

Why am I not able to run sparkPi example on a Kubernetes (K8s) cluster?

我有一个 K8s 集群 运行ning,在 VMWare Workstation 内的虚拟机上,截至目前。我正在尝试使用 here. However, I also landed on this 文章中的官方文档在本机部署 Spark 应用程序,我觉得这更清楚。

现在,我之前的设置是 运行ning 在嵌套 VM 中,基本上我的机器是在 Win10 上,我有一个 Ubuntu VM,里面还有 3 个虚拟机 运行ning对于集群(我知道这不是最好的主意)。

当我按照提到的文章尝试 运行 我的设置时,我首先在集群中创建了一个名为 spark 的服务帐户,然后创建了一个名为 [=13] 的 clusterrolebinding =],将 edit 作为 clusterrole 并将其分配给 spark 服务帐户,以便 Spark 驱动程序 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 后几秒内失败,进入 运行 状态大约 3 秒后进入 Error 状态。

在给出命令时kubectl logs spark-pi-driver this是我得到的日志。

第二个 Caused by: 总是如上所述,即:

Log #2供参考

在 运行 陷入死胡同之后,我尝试提供 --deploy-mode client 以查看它是否有所作为并获得更详细的日志。您可以从 here 中了解客户端和集群模式之间的区别。

将作业部署为 客户端模式 它仍然失败,但是,现在我看到每次驱动程序 pod(现在 运行ning 不是作为 pod,而是作为本地机器上的一个进程)尝试创建一个执行器 pod,它进入一个循环,无限地尝试创建一个执行器 pod,并在 pod 名称后附加一个计数,因为最后一个进入终止状态。此外,现在我可以在 4040 端口上看到 Spark UI,但工作没有继续进行,因为它一直在尝试创建甚至一个执行程序 pod。

我得到 this 日志。

对我来说,这很明显它可能是资源 c运行ch?

所以可以肯定的是,我删除了嵌套的 VM 并在我的主机上设置了 2 个新的 VM,并使用 NAT 网络连接它们并设置了相同的 K8s 集群。

但是现在,当我尝试做完全相同的事情时,它会失败并出现相同的错误(损坏 Pipe/ShutdownException),除了现在它告诉我即使在 创建驱动程序时它也会失败- pod

This是参考日志

现在我什至无法获取有关失败原因的日志,因为它从未创建过。

我为此伤透了脑筋,想不通为什么会失败。现在,我尝试了很多方法来排除它们,但到目前为止,除了一个(这是一个完全不同的解决方案)之外,没有任何效果。

我尝试了 here 的 GCP 的 spark-on-k8-operator,它 对我有效。我没能看到 Spark UI,因为它 运行 很短暂,但它在 shell window 中打印了 Pi 值,所以我知道它有效。 我猜,即使是这个 spark-on-k8s-operator 'internally' 也做同样的事情,但我真的需要能够本地部署它,或者至少知道它失败的原因。

我们将不胜感激(我知道这很长 post)。谢谢。

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

Apache Spark 使用 Kubernetes Client 库与 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

遇到了与 v1.18.0 完全相同的问题,将版本降级到 v1.15.3 使其正常工作

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

Spark on K8s 运算符示例使用了一个有效的 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