到目前为止,我已经在 VMWare Workstation 内的虚拟机上启动并运行了一个 K8s 集群。我正在尝试使用 here 中的官方文档本地部署 Spark 应用程序。然而,我也登陆了 this我觉得这篇文章说得更清楚了。
现在,早些时候我的设置是在嵌套虚拟机内运行,基本上我的机器运行在 Win10 上,并且我有一个 Ubuntu 虚拟机,其中我还有 3 个为集群运行的虚拟机(我知道这不是最好的主意)。
当我尝试按照提到的文章运行我的设置时,我首先在集群内创建了一个名为 spark
的服务帐户。 ,然后创建了一个clusterrolebinding叫spark-role
,给了edit
作为 clusterrole 并将其分配给 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后几秒钟内就会失败,进入正在运行状态,大约3秒后进入错误 状态。
发出命令 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 运行,而是作为本地计算机上的进程运行)尝试创建一个执行器 Pod 时,它会进入无限循环,尝试创建一个执行器 Pod,并在 Pod 名称后附加一个计数数字,最后一个执行器 Pod 进入终止状态。另外,现在我可以在 4040 端口上看到 Spark UI,但该作业无法继续进行,因为它一直停留在尝试创建单个执行程序 Pod 上。
我得到this日志。
对我来说,这很明显表明这可能是资源短缺?
因此,可以肯定的是,我删除了嵌套虚拟机,并在我的主机上设置了 2 个新虚拟机,并使用 NAT 网络连接它们并设置相同的 K8s 集群。
但是现在,当我尝试执行完全相同的操作时,它会失败并出现相同的错误(Broken Pipe/ShutdownException),但现在它告诉我,即使在创建 driver-pod 时它也会失败。
This是供引用的日志。
现在我什至无法获取有关失败原因的日志,因为它甚至从未创建过。
我为此伤透了脑筋,不明白为什么会失败。现在,我尝试了很多方法来排除它们,但到目前为止,除了一个(这是一个完全不同的解决方案)之外,没有任何效果。
我尝试了 GCP 的 spark-on-k8-operator here它对我有用。我无法看到 Spark UI,因为它运行时间很短,但它会在 shell 窗口中打印 Pi 值,所以我知道它可以工作。 我猜测,即使这个 Spark-on-k8s-operator “内部”也做同样的事情,但我确实需要能够在 native 部署它,或者至少知道它为什么失败。
这里的任何帮助将不胜感激(我知道这是一篇很长的文章)。谢谢。
最佳答案
确保您正在部署的 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
关于apache-spark - 为什么我无法在 Kubernetes (K8s) 集群上运行 SparkPi 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61565751/