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
相关产品推荐
相关产品推荐

