Spark 3.1.2中Kubernetes客户端关闭告警致Executor任务挂起的解决方法
问题解答
1. 修复该问题的Spark版本
SPARK-33349对应的修复在Spark 3.2.0版本中正式完成。该修复解决了Kubernetes客户端连接关闭后,ExecutorPodsWatchSnapshotSource组件未正确处理重连逻辑的问题,同时消除了由此引发的Executor任务无限循环、应用挂起的异常。后续Spark 3.x系列的维护版本(如3.2.x、3.3.x等)均继承了该修复逻辑。
2. 无需升级Spark的配置/workaround方案
如果暂时无法升级Spark版本,可尝试以下临时解决方法:
调整Kubernetes客户端连接参数:
提交Spark应用时添加以下配置,提升客户端连接的稳定性:--conf spark.kubernetes.client.connectionTimeout=30s \ --conf spark.kubernetes.client.readTimeout=60s \ --conf spark.kubernetes.client.maxReconnectAttempts=5延长超时时间、增加重连次数,可降低客户端连接意外关闭的概率,减少触发异常的场景。
禁用Pod状态的Watch监听机制:
关闭基于Watch的长连接监听,改用定期轮询方式获取Pod状态(会增加K8s API Server负载,但可规避Watch连接关闭引发的问题):--conf spark.kubernetes.executor.podWatchEnabled=false该配置生效后,Spark会定期调用K8s API查询Pod状态,而非维持长连接的Watch会话,避免客户端关闭后无法自动恢复的问题。
限制任务重试次数:
针对出现无限循环的Executor任务,设置任务失败重试上限,防止任务无限制占用资源导致应用挂起:--conf spark.task.maxFailures=3当任务失败次数达到设定值时,Spark会标记任务失败并进行后续处理,终止无限循环。
内容的提问来源于stack exchange,提问作者Артем Суслов
相关产品推荐
相关产品推荐

