Spark Driver Pod因缺失驱动ConfigMap卡在Init状态原因排查
Kubernetes集群部署Spark应用异常原因分析
故障现象
- Driver Pod长期停留在Init状态,提交47分钟后仍为
Init:0/1状态,Pod事件报错如下:
sparkxpix75ba3dfb-driver 0/1 Init:0/1 0 47m
Warning FailedMount 19s (x20 over 31m) kubelet (combined from similar events): MountVolume.SetUp failed for volume "spark-conf-volume" : configmap "sparkxpix75ba3dfb-1657310554583-driver-conf-map" not found
- SparkSubmit拉起的Java进程持续阻塞无响应,进程启动命令如下(存在明显配置书写错误):
/opt/tools/Linux/jdk/openjdk1.8.0.332_8.62.0.20_x64/bin/java -cp /opt/spark/conf/:/opt/spark/jars/* org.apache.spark.deploy.SparkSubmit --master k8s://https://1.2.3.1:443 --deploy-mode cluster --conf spark.kubernetes.container.image.pullPolicy=IfNotPresent --conf spark.executor.memory=512m --conf spark.driver.memory=512m --conf spark.network.crypto.enabled=true --conf spark.driver.cores=0.100000 --conf spark.io.encryption.enabled=true --conf spark.kubernetes.driver.limit.cores=200m --conf spark.kubernetes.driver.label.version=3.0.1 --conf spark.app.name=sparkxpix75ba3dfb --conf spark.kubernetes.submission.waitAppCompletion=false --conf spark.executor.cores=1 --conf spark.authenticate=true --conf spark.kubernetes.driver.label.sparkoperator.k8s.io/launched-by-spark-operator=true --conf spark.kubernetes.namespace=abc-watch --conf spark.kubernetes.container.image==test:1 --conf spark.kubernetes.executor.label.sparkoperator.k8s.io/launched-by-spark-operator=true --conf spark.kubernetes.driver.label.sparkoperator.k8s.io/submission-id=e7075bf4-c30d-4d53-b924-0d2011555ce1 --conf spark.kubernetes.executor.label.sparkoperator.k8s.io/app-name=sparkxpix75ba3dfb --conf spark.kubernetes.executor.label.sparkoperator.k8s.io/submission-id=e7075bf4-c30d-4d53-b924-0d2011555ce1 --conf spark.kubernetes.driver.pod.name=sparkxpix75ba3dfb-driver --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark-driver-abc-watch --conf spark.executor.instances=1 --conf spark.kubernetes.executor.label.version=3.0.1 --conf spark.kubernetes.driver.label.sparkoperator.k8s.io/app-name=sparkxpix75ba3dfb --class org.apache.spark.examples.SparkPi --jars local:///sample-apps/sample-basic-spark-operator/extra-jars/* local:///sample-apps/sample-basic-spark-operator/sample-basic-spark-operator.jar
- 阻塞进程随时间持续累积,最终导致Spark Operator停止处理新提交的SparkApplication资源。
可能产生原因
1. Driver Pod挂载ConfigMap不存在的直接原因
- 配置参数书写错误导致ConfigMap生成流程中断:启动命令中
spark.kubernetes.container.image配置项误写为双等号==,属于非法参数格式。Spark 3.0.1版本的K8s提交模块遇到该类非法参数时,不会直接抛出异常退出,会在生成Driver挂载所需的spark-conf-volume对应ConfigMap的中途中断流程,ConfigMap未实际创建成功,但Driver Pod的创建请求已经被发送到K8s API Server,kubelet调度Pod后始终找不到对应ConfigMap,就会持续报FailedMount错误,卡Init状态。 - RBAC权限不足导致ConfigMap创建被拒绝:运行SparkSubmit进程的服务账号、或者Spark Operator自身使用的服务账号,缺少目标命名空间
abc-watch下的ConfigMap创建权限,ConfigMap创建请求被API Server拦截拒绝,同时流程没有做Pod创建的回滚,导致Pod悬空等待不存在的ConfigMap。 - API Server请求限流导致ConfigMap创建延迟/失败:如果K8s集群API Server开启了请求限流,Spark任务提交高峰时段ConfigMap创建请求被限流丢弃,也会出现Pod先创建、ConfigMap长时间不存在的问题。
2. SparkSubmit Java进程持续阻塞的原因
- 非法参数触发Spark 3.0.1版本已知bug:该版本SparkSubmit的K8s cluster模式参数校验逻辑存在缺陷,遇到格式错误的conf参数时,不会快速失败退出,反而会卡在参数解析的死循环逻辑中,进程持续驻留不退出。
- 等待逻辑无超时设置:SparkSubmit在cluster模式下默认会持续等待Driver Pod启动完成的状态反馈,由于Driver一直卡Init状态无法Ready,而提交侧没有配置API请求超时、状态等待超时参数,进程会一直阻塞等待状态更新,不会主动退出。
- 网络连通性异常导致请求挂死:如果运行SparkSubmit的节点和K8s API Server之间存在网络丢包、防火墙拦截静默丢弃的情况,API请求没有返回TCP reset响应,会导致SparkSubmit的HTTP请求一直挂起,进程阻塞。
3. 阻塞进程累积拖垮Spark Operator的原因
- 子进程回收机制失效:Spark Operator默认会为每个待提交的SparkApplication拉起独立的SparkSubmit子进程,同步等待子进程返回提交结果。如果没有配置子进程超时强制杀死策略,阻塞的SparkSubmit进程会持续累积,占满Operator的进程句柄数、工作线程数,没有多余资源处理新任务。
- 调谐队列被异常任务占满:大量处于Init失败状态的SparkApplication会持续触发Operator的重入调谐逻辑,重复重试提交,把Operator的工作队列占满,新提交的SparkApplication资源无法进入调度流程,表现为停止处理新请求。
- 资源泄漏:长期阻塞的SparkSubmit进程会持续占用内存、CPU资源,当Operator所在节点的资源被占满后,Operator本身的运行会出现异常,无法正常处理请求。
内容的提问来源于stack exchange,提问作者Ganga
相关产品推荐
相关产品推荐

