Linux下Airflow2.3.2命令行运行任务触发DAG报DagNotFound/DagRunNotFound错误
问题背景
Linux环境下使用standalone模式部署Airflow 2.3.2版本,参照官方本地启动教程操作,通过命令行运行Airflow任务时,仅将示例命令中的执行日期替换为当日日期:
airflow tasks run example_bash_operator runme_0 2022-06-15
执行后持续返回报错:
airflow.exceptions.DagRunNotFound: DagRun for example_bash_operator with run_id or execution_date of '2022-06-15' not found
在Web GUI界面点击运行按钮可以正常启动该任务,但尝试传入多组run_id、execution_date参数值,均无法通过命令行成功执行任务。
后续尝试执行DAG触发命令:
airflow dags trigger example_bash_operator
返回同类报错:
airflow.exceptions.DagNotFound: Dag id example_bash_operator not found in DagModel
根因分析
两个报错对应两个独立的配置/逻辑问题:
DagNotFound:当前执行命令的终端连接的Airflow实例和WebUI对应的实例不一致。standalone模式默认读取当前终端AIRFLOW_HOME环境变量路径下的配置与元数据库,如果启动standalone服务和执行命令不在同一个终端会话、或者切换了系统用户,命令行会默认读取当前用户家目录下初始化的空Airflow环境,该环境没有加载过示例DAG,自然无法识别到对应DAG ID。此外2.3.2版本standalone启动时如果没有将配置持久化到配置文件,新开会话默认关闭示例DAG加载开关,也会导致命令行读不到示例DAG。DagRunNotFound:airflow tasks run命令本身不会自动创建DAG运行记录,WebUI点击触发时后台会先生成对应执行日期的DagRun记录再调度下游任务,直接跳过DagRun创建步骤执行task命令,就会触发找不到对应运行记录的报错。
修复步骤
- 统一环境变量配置
先在执行命令的终端执行echo $AIRFLOW_HOME,确认输出路径和启动standalone服务时的Airflow工作目录完全一致(默认路径为启动服务的用户家目录下的airflow文件夹)。如果路径不一致,执行如下命令指定正确路径:export AIRFLOW_HOME=/your/actual/airflow/path - 确认DAG可被命令行识别
打开$AIRFLOW_HOME/airflow.cfg配置文件,找到load_examples配置项,将值改为True后保存。执行如下命令重新解析所有DAG文件:
解析完成后执行airflow dags reserializeairflow dags list,确认输出列表中存在example_bash_operator,说明命令行已经可以正常识别目标DAG。 - 按正确顺序触发任务
先创建对应执行日期的DagRun记录,再执行任务运行命令:# 触发指定执行日期的DAG运行 airflow dags trigger example_bash_operator -e 2022-06-15 # 等待2-3秒DagRun创建完成后,运行对应task airflow tasks run example_bash_operator runme_0 2022-06-15
如果仅做本地测试不想等待DagRun创建,可以在tasks run命令中追加参数跳过存在性校验,直接运行本地任务实例(生产环境不建议使用该方式):
airflow tasks run example_bash_operator runme_0 2022-06-15 --ignore-dependencies --local
内容的提问来源于stack exchange,提问作者Jeremy McCormick
相关产品推荐
相关产品推荐

