如何解决Spark K8s集群模式下ConfigMap未找到的启动错误?
Spark Driver Pod启动失败:ConfigMap未找到的解决方法
错误说明
Driver Pod启动时出现以下错误:
MountVolume.SetUp failed for volume "spark-conf-volume-driver" : configmap "spark-drv-8458dd8e0e30c9d0-conf-map" not found
这个自动生成的ConfigMap是Spark提交流程中用来传递配置给Driver的核心资源,找不到它通常和权限配置、提交参数异常有关,以下是具体解决步骤:
1. 补全ServiceAccount的权限
你创建的spark ServiceAccount需要拥有目标命名空间内创建、读取ConfigMap的权限,否则Spark无法自动生成所需的配置映射。
修正Role权限规则
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: namespace-spark name: spark-role rules: - apiGroups: [""] resources: ["configmaps", "pods", "services", "persistentvolumeclaims"] verbs: ["get", "list", "watch", "create", "update", "delete"]
确认RoleBinding绑定关系
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: namespace-spark name: spark-role-binding subjects: - kind: ServiceAccount name: spark namespace: namespace-spark roleRef: kind: Role name: spark-role apiGroup: rbac.authorization.k8s.io
2. 调整SparkLauncher的提交参数
检查并修正以下几个关键配置:
- 移除
setSparkHome("/opt/spark"):K8s集群模式下,Spark环境由容器镜像提供,本地指定的SparkHome会干扰自动配置流程。 - 确认
spark.kubernetes.namespace配置的一致性:确保所有资源都在namespace-spark下创建,避免跨命名空间查找ConfigMap。 - 验证镜像内文件路径:确认
local:///jars/spark.jar在你指定的spark-launcher-example镜像中真实存在,路径错误可能触发异常流程,导致ConfigMap创建失败。
调整后的核心代码片段:
SparkLauncher launcher = new SparkLauncher() .setMaster("k8s://https://" + host+ ":" + port) .setDeployMode("cluster") .setMainClass("example.sparkLauncher") .setConf("spark.kubernetes.namespace", "namespace-spark") .setConf(SparkLauncher.DRIVER_MEMORY, "500m") .setConf(SparkLauncher.EXECUTOR_CORES, "1") .setConf(SparkLauncher.EXECUTOR_MEMORY, "500m") .setConf("spark.executor.instances", "1") .setAppName("spark-Launcher") .setAppResource("local:///jars/spark.jar") .setConf( "spark.kubernetes.container.image", "spark-launcher-example") .setConf("spark.kubernetes.authenticate.driver.serviceAccountName", "spark") .setConf("spark.kubernetes.driver.volumes.emptyDir.spark-shared.mount.path", "/tmp") .setConf("spark.kubernetes.driver.volumes.emptyDir.spark-shared.mount.readOnly", "false") .addJar("local:///jars/spark.jar") .setVerbose(true) .addAppArgs(argPropertyString); launcher.launch();
3. 手动指定ConfigMap(自动创建失效时)
如果自动生成ConfigMap的机制持续异常,可以手动创建配置映射并通过SparkConf挂载:
手动创建ConfigMap
apiVersion: v1 kind: ConfigMap metadata: name: spark-custom-conf namespace: namespace-spark data: spark-defaults.conf: | spark.driver.memory 500m spark.executor.cores 1 spark.executor.memory 500m # 添加其他需要的Spark配置
在SparkLauncher中添加挂载配置
.setConf("spark.kubernetes.driver.volumes.configMap.spark-conf-volume-driver.mount.path", "/opt/spark/conf") .setConf("spark.kubernetes.driver.volumes.configMap.spark-conf-volume-driver.name", "spark-custom-conf") .setConf("spark.kubernetes.driver.volumes.configMap.spark-conf-volume-driver.mount.readOnly", "true")
4. 排查辅助手段
- 用
kubectl describe pod <driver-pod-name> -n namespace-spark查看Pod事件,确认是否有其他权限或资源限制问题。 - 查看Spark提交日志(已开启
setVerbose(true)),定位ConfigMap创建失败的具体报错信息。
内容的提问来源于stack exchange,提问作者Developer208
相关产品推荐
相关产品推荐

