You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark作业执行JSON Schema推断时随机被取消的原因及排查方法

Spark作业Schema推断阶段随机取消的原因与排查步骤

问题背景

我有一个Spark作业,需先执行JSON Schema推断,再运行实际任务。推断Schema使用的代码为:

sqlContext.sparkSession.read.json(df.select($"columns").as[String])

该作业多数情况下运行正常,但偶尔会被取消导致失败,相关特征:

  • 不同Schema场景下均会出现此问题
  • 问题随机发生,重试同一表即可成功,故障出现频率较低

驱动端日志片段:

...
Submitting 1 missing tasks from ResultStage 805119
Adding task set 805119.0 with 1 tasks resource profile 0
Asked to cancel job 225796
(More logs related to cancellation and eventual job failure)

已排除的情况:日志未说明取消原因,排除手动取消(故障发生过于频繁);不存在执行器故障或超时(任务未被执行器接收,从任务创建到取消间隔不足1秒);Schema推断完成后的实际作业极少被取消(或可能是日志过滤问题)。

可能原因

  • Spark调度器内部状态异常:Schema推断属于轻量作业,若集群同时运行其他作业,调度器在任务分配、状态同步时可能出现偶发的逻辑冲突,触发误取消操作。
  • JSON Schema推断逻辑的隐式异常:read.json自动推断Schema时,会执行采样、元数据解析等操作,若采样过程中遇到数据格式的极端情况(如极小概率的非法JSON片段),可能触发内部未暴露的异常,间接导致作业取消。
  • 集群瞬时资源耗尽:任务提交瞬间,集群的CPU、内存、端口等资源出现瞬时饱和,调度器为避免资源死锁,主动取消该轻量作业。
  • Spark版本已知bug:部分Spark版本(尤其是2.x与3.x过渡版本)在轻量作业调度、JSON数据源处理模块存在偶发的作业取消bug,这类问题通常在后续版本中被修复。

排查步骤

  • 升级日志级别:将驱动和集群的日志级别调整为DEBUG,重点监控org.apache.spark.scheduler、org.apache.spark.sql.execution.datasources.json路径下的日志,捕捉作业取消的触发堆栈和详细原因。
  • 替换Schema推断逻辑:改用显式定义Schema,或者手动抽取固定比例的数据集生成Schema(如df.sample(0.01).write.json(tempPath); spark.read.json(tempPath).schema),替代自动推断逻辑,验证问题是否消失。
  • 监控集群瞬时资源:在故障高发时段,实时监控集群节点的CPU使用率、内存剩余量、网络连接数、磁盘IO等指标,排查是否存在瞬时资源耗尽的情况。
  • 验证Spark版本兼容性:查阅当前Spark版本的官方release notes,确认是否存在作业调度或JSON数据源相关的已知bug,尝试升级到同系列的稳定版本进行测试。
  • 隔离轻量作业资源:为Schema推断作业配置单独的资源profile(通过spark.resourceProfile),或调整spark.sql.shuffle.partitions为极小值(如1),减少与其他作业的资源竞争。
  • 捕获代码层面异常:在Schema推断代码块外层添加try-catch,捕获并打印所有RuntimeException及堆栈信息,排查是否存在隐藏的异常触发作业取消。

内容的提问来源于stack exchange,提问作者jeekiii

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:23