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

时间:2020-05-02 20:18:57

标签: apache-spark kubernetes rbac kubernetes-pod

到目前为止,我已经在VMWare Workstation内的VM上启动并运行了一个K8s集群。我正在尝试使用here中的官方文档在本地部署Spark应用程序。但是,我也觉得this的文章更清楚了。

现在,较早之前,我的设置是在嵌套VM中运行的,基本上我的机器是在Win10上运行的,而我有一个Ubuntu VM,其中有3个为该群集运行的VM(我知道这不是最好的主意)。

当我按照上述文章尝试运行安装程序时,我首先在集群内创建了一个名为spark的服务帐户,然后创建了一个名为spark-role的{​​{3}},并给了{{ 1}}作为集群角色,并将其分配给edit服务帐户,以便Spark驱动程序窗格具有足够的权限。

然后我尝试使用以下命令行运行示例SparkPi作业:

spark

它在创建 driver-pod 后几秒钟内失败,进入 Running 状态,大约3秒钟后进入 Error < / strong>状态。

给出命令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 clusterrolebinding是我得到的日志。

第二个kubectl logs spark-pi-driver总是如上所述之一,即:

  • Caused by:
  • Caused by: java.net.SocketException: Broken pipe (Write failed)

this供参考。

遇到这种死胡同后,我尝试给Caused by: okhttp3.internal.http2.ConnectionShutdownException看看它是否有所作为并获得更多详细的日志。您可以从Log #2读取客户端和群集模式之间的区别。

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

我收到here日志。

对我来说,这似乎很明显是资源紧缩吗?

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

但是现在,当我尝试执行完全相同的操作时,它会失败,并显示相同的错误(Broken Pipe / ShutdownException),但现在它告诉我即使在创建驱动程序容器时,它也会失败。

this是参考日志。

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

我为此感到震惊,不知道为什么它失败了。现在,我尝试了很多方法来将它们排除在外,但是到目前为止,除了一种方法(完全不同的解决方案)之外,什么都没有起作用。

我尝试了来自This的GCP的 k8-spark操作员,它对我有效。我无法看到Spark UI短暂运行,但它会在Shell窗口中打印Pi值,所以我知道它可以工作。 我猜想,即使这个“ k8s上的spark-operator”也“内部”执行相同的操作,但我确实需要能够在本地进行部署,或者至少知道它为什么会失败。

这里的任何帮助将不胜感激(我知道这是一篇很长的文章)。谢谢。

3 个答案:

答案 0 :(得分:4)

确保要部署的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

答案 1 :(得分:0)

面对与v1.18.0完全相同的问题,将该版本降级至v1.15.3使其可以正常工作

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

答案 2 :(得分:0)

K8s操作符上的火花使用有效的Spark图像(来自gcr.io)。您可以在spark-on-k8s-operator/examples/spark-pi.yaml

中找到图片标签
spec:
  ...
  image: "gcr.io/spark-operator/spark:v2.4.5"
...

我试图替换image中的bin/spark-submit配置,并且对我有用。

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