通过在 k8s 中的主 pod 上执行 exec 来提交作业

spark-submit job by doing exec on a master pod in k8s

我已经在 kubernetes 上成功创建了 spark 集群,其中有 1 个 master 和 2 个 worker pods。 k8s 上的 spark v2.4.3 运行 Java 8 和 scala 2.11.12 以及 kubectl v1.16.0 和 minikube v1.4.0。

详细 kubectl get pods 显示此 -

NAME                            READY   STATUS    RESTARTS   AGE
spark-master-fcfd55d7d-qrpsw    1/1     Running   0          66m
spark-worker-686bd57b5d-6s9zb   1/1     Running   0          65m
spark-worker-686bd57b5d-wrqrd   1/1     Running   0          65m

我还可以 运行 通过 execing master pod 内置 spark 应用程序,例如 pysparkspark-shell -

kubectl exec spark-master-fcfd55d7d-qrpsw -it spark-shell` 

因为我已经有足够的环境,所以我正在尝试 运行 我的 spark 工作像上面一样。但它不起作用。 spark 提交命令如下所示。

#!/usr/bin/env bash

spark-submit \
   --class com.cloudian.spark.main.RequestInfoLogStreamer \
   /Users/atekade/IdeaProjects/scala-spark-streaming/target/scala-2.11/scala-spark-streaming_2.11-1.0.jar

然后 .sh 脚本被提交给 master pod -

kubectl exec spark-master-fcfd55d7d-qrpsw /Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh

但这给我错误 -

OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"/Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh\": stat /Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh: no such file or directory": unknown
command terminated with exit code 126

我在这里做错了什么?我的意图是让这些主节点和工作节点完成工作。

从错误中可以看出:

OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "exec: \"/Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh\": stat /Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh: no such file or directory": unknown command terminated with exit code 126

我们最感兴趣的是 /Users/atekade/IdeaProjects/scala-spark-streaming/logstreamer.sh: no such file or directory 部分,这意味着 pod 无法找到 logstreamer.sh 文件。

脚本 logstreamer.sh 需要上传到 spark-master pod。 scala-spark-streaming_2.11-1.0.jar 也需要在那里。

您可以配置一个 PersistenVolume for Storage,这将很有用,因为如果您的 pod 将被重新安排,则所有未存储在 PV 上的数据都将丢失。

这是持久卷的 link 到 minikube documentation

您也可以使用不同的 Storage Classes