Airflow误识别非DAG Python文件为DAG致报错的解决咨询
问题描述
我的项目目录结构如下:
project folder 1 |--project folder 2 |-- DAGS |--dag1 |--dag2 |--utils |-- __init__.py |--python folder |-- __init__.py |-- python.py
其中python.py是仅用于终端运行的工具脚本(用于参数化查询),但Airflow会将其识别为DAG文件,加载时触发以下报错:
Broken DAG: [/home/airflow/gcs/dags/project folder2/DAGs/utils/python folder/python.py] Traceback (most recent call last): File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/airflow/gcs/dags/project folder2/DAGs/utils/python folder/python.py", line 10, in <module> sql_file = sys.argv[2] IndexError: list index out of range
报错原因是该脚本运行时需要三个终端参数,相关代码如下:
dag_directory = sys.argv[1] sql_file = sys.argv[2] sql_path = os.getcwd() + '\\project folder2\\DAGs\\' + dag_directory + '\\sql\\' + sql_file direction = sys.argv[3]
解决办法
将工具脚本移出DAG目录
Airflow默认会扫描DAGS目录下所有.py文件并尝试解析为DAG,直接把python.py移到DAGS目录外即可避免被加载。调整后的目录结构示例:project folder 1 |--project folder 2 |-- DAGS |--dag1 |--dag2 |-- utils |-- python folder |-- __init__.py |-- python.py修改Airflow扫描规则
在Airflow配置文件airflow.cfg中,修改dags_glob_pattern参数,指定只加载特定命名的DAG文件,比如仅扫描以dag_开头的文件:dags_glob_pattern = dag_*.py修改后重启Airflow服务生效。
给脚本添加运行判断
在python.py中加入__name__ == "__main__"判断,仅当脚本被直接运行时才执行需要参数的逻辑,避免Airflow加载时触发报错:import sys import os if __name__ == "__main__": dag_directory = sys.argv[1] sql_file = sys.argv[2] sql_path = os.getcwd() + '\\project folder2\\DAGs\\' + dag_directory + '\\sql\\' + sql_file direction = sys.argv[3] # 后续业务逻辑代码配置Airflow忽略指定文件/目录
在airflow.cfg中设置ignore_file_patterns参数,让Airflow跳过utils目录或目标脚本:ignore_file_patterns = */utils/*, python.py配置完成后重启Airflow服务。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

