Airflow升级后出现SerializedDagNotFound错误是否会导致Scheduler宕机?
推测合理性验证
你的推测完全成立。Airflow 2.x 默认开启了序列化DAG机制,调度器运行时会优先读取元数据库中存储的序列化DAG信息,无需每次都扫描DAG文件。当DAG文件被删除后,默认配置下元数据库中对应的DAG记录不会被物理删除,只会被自动标记为active=False,如果调度器中仍残留该DAG的历史调度计划、或旧的DAG运行实例还在处理,就会触发airflow.exceptions.SerializedDagNotFound错误。
Airflow 1.10.x 未默认开启序列化DAG机制,删除DAG文件后不会触发这类报错,这是你版本迁移后才出现问题的核心原因。
错误与调度器宕机的关联
该错误本身不会直接导致调度器宕机。如果出现调度器偶发宕机,建议排查两个方向:
- 检查是否开启了调度器
fail-fast类的特殊配置,默认配置下这类业务错误只会被记录日志,不会触发进程退出 - 排查AWS ECS层面的事件:是否存在CPU/内存阈值触发OOM kill、调度器健康检查失败被ECS强制重启的情况,Cloudwatch默认仅捕获进程输出的日志,ECS强制终止的事件需要到ECS事件中心查看。
active与is_paused状态的区别
两个字段的控制逻辑完全独立:
is_paused:控制DAG的调度开关,为True时调度器不会生成新的DAG Run,已经生成的DAG Run仍会正常执行,该字段就是UI上ON/OFF按钮直接控制的字段,你之前的观察完全正确。active:标记DAG是否存在于当前DAG目录中,当Airflow扫描DAG目录找不到对应DAG文件时,会自动把该DAG的active字段设为False,active=False的DAG不会在UI的任何默认视图中展示,调度器也会停止处理该DAG的所有相关任务。
状态修改方法与问题修复方案
UI修改限制
UI默认没有提供修改active字段的入口,仅能通过UI的ON/OFF按钮修改is_paused的值。如果要修改active字段,可通过两种方式实现:
- 把被删除的DAG文件重新放回DAG目录,等待DAG扫描完成后,系统会自动把
active字段改回True,DAG会重新在UI展示 - 直接操作元数据库,执行SQL更新对应记录的
active值,或者直接删除已经不需要的active=False的DAG记录,示例SQL:
-- 执行前请确认对应DAG不需要恢复 DELETE FROM dag WHERE active = FALSE;
永久避免报错的配置
你可以在airflow.cfg中开启自动清理非活跃DAG的配置:
[scheduler] delete_orphaned_dags_after = 24h
开启后,调度器会自动删除已经超过24小时处于active=False状态的DAG及其关联记录,不会再触发对应的序列化DAG找不到的错误。
内容的提问来源于stack exchange,提问作者mrc
相关产品推荐
相关产品推荐

