Apache Airflow孤立旧DAG反复运行无法终止,求原因解析
核心原因
你遇到的情况是因为Airflow的用户数据没有彻底清理——卸载重装Python包只会移除Airflow本身的代码,但元数据库、DAG缓存、默认路径下的残留文件这些用户数据不会被自动删除,调度器启动后依然能读取到旧DAG的信息,进而触发任务。
具体排查与解决步骤
确认元数据库位置并清理
打开Airflow的配置文件(默认路径是~/airflow/airflow.cfg),找到core.sql_alchemy_uri配置项,这里指定了元数据库的位置。比如默认的SQLite路径是sqlite:////home/你的用户名/airflow/airflow.db,去这个路径删除对应的数据库文件,不要只删项目里的db文件。如果之前用的是PostgreSQL/MySQL,要登录数据库手动删除Airflow相关的库或表。清空DAG读取目录
同样在airflow.cfg里找core.dags_folder,确认调度器读取DAG文件的目录(默认是~/airflow/dags),把这个目录里的所有旧文件彻底删除,只保留新项目的DAG文件。清理序列化DAG缓存
删除$AIRFLOW_HOME/dags/dag_serialized文件夹下的所有文件——Airflow会把DAG序列化后存在这里,就算原DAG文件删了,缓存文件还在的话调度器依然会加载。彻底终止所有Airflow进程
用命令ps aux | grep airflow查看所有Airflow相关进程,包括调度器、worker、webserver,用kill -9 进程ID杀掉所有残留进程,避免旧进程还在读取缓存。重新初始化数据库并启动
运行airflow db init重建元数据库,之后再启动调度器,旧DAG就不会再跑了。
关于日志的解释
日志里的schedule_job_runner.py resetting orphaned tasks for active dags是调度器在检查状态异常的任务(比如之前被强制终止但元数据里状态没更新的任务),把这些任务重置为可运行状态。之所以会触发这个逻辑,就是因为元数据库里还残留着旧DAG和任务的记录,调度器认为这些任务属于“活跃DAG”,所以会尝试重置并运行。
内容的提问来源于stack exchange,提问作者d789w

