Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么我不能在Kubernetes(K8s)集群上运行sparkPi示例?_Apache Spark_Kubernetes_Rbac_Kubernetes Pod - Fatal编程技术网

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

Apache spark 为什么我不能在Kubernetes(K8s)集群上运行sparkPi示例?,apache-spark,kubernetes,rbac,kubernetes-pod,Apache Spark,Kubernetes,Rbac,Kubernetes Pod,到目前为止,我已经在VMWare Workstation内的虚拟机上安装并运行了一个K8s群集。我正在尝试使用来自的官方文档以本机方式部署Spark应用程序。然而,我也发现了一篇文章,这篇文章让我感觉更清楚了 现在,早些时候我的设置是在嵌套的虚拟机中运行的,基本上我的机器是在Win10上的,我有一个Ubuntu虚拟机,里面有3个虚拟机在为集群运行(我知道这不是最好的主意) 当我试图按照上面提到的文章运行安装程序时,我首先在集群中创建了一个名为spark的服务帐户,然后创建了一个名为spark r

到目前为止,我已经在VMWare Workstation内的虚拟机上安装并运行了一个K8s群集。我正在尝试使用来自的官方文档以本机方式部署Spark应用程序。然而,我也发现了一篇文章,这篇文章让我感觉更清楚了

现在,早些时候我的设置是在嵌套的虚拟机中运行的,基本上我的机器是在Win10上的,我有一个Ubuntu虚拟机,里面有3个虚拟机在为集群运行(我知道这不是最好的主意)

当我试图按照上面提到的文章运行安装程序时,我首先在集群中创建了一个名为
spark
的服务帐户,然后创建了一个名为
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
bin/spark提交\
--主机k8s://https://:\
--部署模式群集\
--名称火花pi\
--类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
并且在创建驱动程序吊舱后几秒钟内失败,进入运行状态,大约3秒钟后进入错误状态

发出命令时,kubectl logs spark pi driver是我得到的日志

由:引起的第二个
,总是如上所述,即:

  • 原因:java.net.SocketException:管道破裂(写入失败)
  • 原因:okhttp3.internal.http2.ConnectionShutdownException
供参考

在遇到这种情况的死胡同之后,我尝试给
--deploy mode client
,看看它是否有什么不同,并获得更多详细的日志。您可以从中读取客户端模式和群集模式之间的差异

在将作业部署为客户端模式时仍然失败,但是,现在我看到,每次驱动程序pod(现在不是作为pod运行,而是作为本地机器上的进程运行)尝试创建执行器pod时,它都会进入一个循环,无限尝试创建一个执行器pod,并在pod名称后面附加一个计数号,当最后一个进入终止状态时。此外,现在我可以在4040端口上看到Spark UI,但作业没有向前移动,因为它一直在尝试创建一个执行器吊舱

我得到了日志

对我来说,这很明显,这可能是一个资源短缺

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

但是现在,当我尝试做完全相同的事情时,它失败了,出现了相同的错误(断管/关机异常),只是现在它告诉我,它甚至在创建驱动程序pod时也失败了

是供参考的日志

现在我甚至无法获取日志来解释它失败的原因,因为它从未被创建过

我被这件事弄得头破血流,不知道为什么它会失败。现在,我尝试了很多方法来排除它们,但到目前为止,除了一个(这是一个完全不同的解决方案)外,其他方法都不起作用

我尝试了来自GCP的spark-on-k8-operator,它对我有效。我无法看到Spark UI,因为它运行时间很短,但它会在shell窗口中打印Pi值,所以我知道它可以工作。 我猜,即使这个spark-on-k8s-operator“内部”也做同样的事情,但我真的需要能够在本地部署它,或者至少知道它失败的原因


这里的任何帮助都将不胜感激(我知道这是一个很长的帖子)。谢谢。

确保您正在部署的kubernetes版本与您正在使用的Spark版本兼容

ApacheSpark使用Kubernetes客户端库与Kubernetes集群通信

目前最新的LTS Spark版本为2.4.5,其中包括kubernetes客户端版本4.6.3

检查Kubernetes客户端的兼容性矩阵

受支持的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 start--CPU=4--memory=4048--K8s上的kubernetes版本v1.15.3

Spark操作符示例使用一个工作正常的Spark映像(来自
gcr.io
)。您可以在
spark-on-k8s-operator/examples/spark pi.yaml

spec:
  ...
  image: "gcr.io/spark-operator/spark:v2.4.5"
...
我试图替换
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

okhttp for jdk8中似乎有一个bug,我们已经用补丁升级了okhttp。我们将在下周尽快发布。对于由此引起的不协调表示歉意此问题也可能是由k8s群集的fabric8 Kubernetes客户端和Kubernetes API不兼容引起的。请参考答案。@RohanKumar我看到一个带有补丁的版本发布于4.10.0。我更新了Spark中的依赖项,但是
断管仍然存在there@RohanKumar是的,我已经将我的open-jdk-8版本降级到252之前的版本,并且它甚至无法创建驱动程序pod的错误已经消失,但是关闭异常仍然存在,现在为类型[pod]执行“操作[get]”失败。然而,@aliaksandsasnouskikh的评论起了作用。我在K8上