apache-spark - 为什么我无法在 Kubernetes (K8s) 集群上运行 SparkPi 示例?

标签 apache-spark kubernetes rbac kubernetes-pod

到目前为止,我已经在 VMWare Workstation 内的虚拟机上启动并运行了一个 K8s 集群。我正在尝试使用 here 中的官方文档本地部署 Spark 应用程序。然而,我也登陆了 this我觉得这篇文章说得更清楚了。

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

当我尝试按照提到的文章运行我的设置时,我首先在集群内创建了一个名为 spark 的服务帐户。 ,然后创建了一个clusterrolebindingspark-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/

相关文章:

kubernetes - 无法访问谷歌云上暴露的外部 IP

azure - 请求 Azure 服务管理 API 范围有限的 Azure Active Directory token

kubernetes - 禁止在 apiGroups 中添加角色.rbac.authorization.k8s.io

scala - 仅保留数据帧列中具有重复值的行

scala - Spark - 将嵌套列更新为字符串

postgresql - 将 azure 文件存储与 kubernetes 和 azure 容器服务 (aks) 一起使用 - 权限被拒绝

kubernetes - 如何创建额外的 istio 入口网关?

apache-spark - 如何检测pyspark中的空列

apache-spark - 为什么 Spark Streaming 执行器在不同的时间启动?

kubernetes - 如何使用 kubectl 检查 RBAC 是否启用