为什么我无法在 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:
总是如上所述,即:
Caused by: java.net.SocketException: Broken pipe (Write failed)
或者,
Caused by: okhttp3.internal.http2.ConnectionShutdownException
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
我有一个 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:
总是如上所述,即:
Caused by: java.net.SocketException: Broken pipe (Write failed)
或者,Caused by: okhttp3.internal.http2.ConnectionShutdownException
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