到目前为止,我已经在VMWare Workstation内的VM上启动并运行了一个K8s集群。我正在尝试使用here中的官方文档在本地部署Spark应用程序。但是,我也觉得this文章更清楚了。
现在,我的安装程序以前是在嵌套的VM内运行的,基本上我的机器是在Win10上运行的,我有一个Ubuntu VM,其中有3个为群集运行的VM(我知道这不是最好的主意)。
[按照下面的文章尝试运行安装程序时,我首先在群集中创建了一个名为spark
的服务帐户,然后创建了一个名为clusterrolebinding的spark-role
,并以edit
作为群集角色并为其进行了分配spark
服务帐户,以便Spark驱动程序窗格具有足够的权限。
然后我尝试使用此命令行运行示例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后几秒钟内失败,它进入Running状态,大约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(现在不是作为pod运行,而是作为本地计算机上的进程运行)尝试创建执行程序pod ,当最后一个进入终止状态时,它会无限循环地尝试创建一个执行者Pod,并在Pod名称后附加一个计数编号。另外,现在我可以在4040端口上看到Spark UI,但是该工作并没有向前推进,因为它甚至试图创建单个执行程序Pod。
我收到this日志。
对我来说,这很明显可能是资源紧缩?
因此,可以肯定的是,我在主机上删除了嵌套的VM,并设置了2个新的VM,并使用NAT网络连接它们并设置了相同的K8s群集。
但是现在当我尝试做完全相同的事情时,它会失败,并显示相同的错误(Broken Pipe / ShutdownException),但现在它告诉我即使在创建驱动程序-pod]时它也会失败。
This是参考日志。
现在我什至无法获取有关失败原因的日志,因为甚至从未创建过它。
我为此烦恼不已,不知道为什么它失败了。现在,我尝试了很多方法来将它们排除在外,但到目前为止,除了一种方法(完全不同的解决方案)之外,其他任何方法都没有起作用。
我从here尝试了GCP的spark-on-k8-operator
,对我来说它工作。我无法看到Spark UI短暂运行,但是它在Shell窗口中打印Pi值,所以我知道它可以工作。我猜想,即使是这个“ k8s上的spark-operator”也可以“内部”执行相同的操作,但我确实需要能够在本地进行部署,或者至少知道它为什么会失败。这里的任何帮助将不胜感激(我知道这是一篇很长的文章)。谢谢。
到目前为止,我已经在VMWare Workstation内的VM上启动并运行了一个K8s集群。我正在尝试使用此处的官方文档在本地部署Spark应用程序。但是,我也登陆了...
确保您正在部署的kubernetes版本与您正在使用的Spark版本兼容。