首页 > 解决方案 > Google Cloud Kubernetes 集群上的 Spark - 不断驱逐执行者:工作人员已注册并拥有足够的资源

问题描述

我已按照以下说明进行操作,除了 minicube,我使用了 Google Cloud Platform Kubernetes 集群:(Spark 2.3.2)

https://testdriven.io/blog/deploying-spark-on-kubernetes/

当我提交火花作业时:

./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://spark-master:7077 \
  --executor-memory 471859200 \
  --total-executor-cores 20 \
  --deploy-mode cluster \
  /opt/spark/examples/jars/spark-examples_2.11-2.3.2.jar \
  10

或者简单地使用以下命令打开 Spark shell:

/opt/spark/bin/spark-shell --master spark://spark-master:7077
sc.makeRDD(List(1,2,4,4)).count

我不断收到以下警告消息:

2020-04-18 21:14:38 WARN  TaskSchedulerImpl:66 - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
2020-04-18 21:14:53 WARN  TaskSchedulerImpl:66 - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources

在 Spark UI 上,我可以看到我的所有 Worker 节点,我可以通过以下方式轻松控制:

kubectl scale deployment spark-worker --replicas 2 (or any other number, works fine)

我在 Spark UI 上看到一个新的正在运行的应用程序,它保留在现有的执行程序上。我看到它上升到 309 个执行程序,然后我从 Spark UI 中终止了这项工作。

本地模式运行成功:

/opt/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[2] /opt/spark/examples/jars/spark-examples_2.11-2.3.2.jar 10

我从 Master Kubernetes pod 触发所有 spark 提交:

kubectl exec -it spark-master-dc7d76bf5-dthvn bash

我究竟做错了什么?请让我知道您希望我提供哪些其他系统详细信息。谢谢。

编辑:添加 Executors 的 Spark UI 截图: 在此处输入图像描述

工作人员日志:https ://drive.google.com/file/d/1xU07m_OB1BEzJXyJ30WzvA5vcrpVmxYj/view?usp=sharing

主日志: K8 主日志上的火花

标签: apache-sparkkubernetespysparkgoogle-kubernetes-enginespark-submit

解决方案


嗨,问题可能是因为在 spark 提交上设置了执行程序实例的数量。当我们给 1 作为 executor 的数量时,驱动程序将在该 executor 上运行,对于所有其他任务,将不会有任何 executor 运行。我们需要给 Num executors 至少 2 个,以便驱动程序将在一个执行程序上运行,而工作人员将获得另一个。

我最初使用如下,在更改执行者数量后它起作用了。

bin/spark-submit --name test --master k8s://https://*****:6443 --deploy-mode cluster --class com.classname --conf spark.kubernetes.driver.pod。 name=test --conf spark.kubernetes.authenticate.submission.caCertFile=/etc/kubernetes/pki/ca.crt --conf spark.kubernetes.authenticate.driver.caCertFile=/etc/kubernetes/pki/ca.crt - -conf spark.kubernetes.authenticate.executor.caCertFile=/etc/kubernetes/pki/ca.crt --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace=default --conf spark .executor.instances=3 --conf spark.kubernetes.container.image=spark:latest --conf spark.dynamicAllocation.enabled=false --conf spark.shuffle.service.enabled=false --conf spark.kubernetes.driver.limit.cores=1 --conf spark.kubernetes.executor.limit.cores=1 local:///opt/spark/examples/jars/examplejar.jar


推荐阅读