为何我的Airflow DAG触发后无执行效果却显示执行成功?
Airflow DAG显示成功但无执行效果的排查与解决
以下是针对你遇到问题的具体排查方向和修复方案:
1. 修正动态start_date问题
你的DAG使用datetime.today()作为start_date,这是一个动态值——每次Airflow调度器解析DAG时,都会生成新的当前时间,导致Airflow无法正确追踪DAG的运行状态,可能出现任务标记为成功但实际未执行的情况。
将start_date改为固定的过去时间:
start_date=datetime(2024, 5, 20) # 替换为一个早于当前时间的固定日期
2. 优化异常捕获与日志输出
当前代码用except:静默捕获所有异常,返回False但Airflow会判定任务成功,无法定位问题。修改为捕获具体异常并输出日志,同时抛出异常让任务标记为失败:
from airflow.utils.log.logging_mixin import LoggingMixin def _select(): log = LoggingMixin().log engine = create_engine("postgresql://postgres:123456@localhost:5433/main_base") try: with engine.connect() as conn: # 修正SQL引号问题:原语句的"'med'"会插入带单引号的值,若不符合预期改为'med' statement = conn.execute(text( ''' INSERT INTO public.main("id", "name") VALUES (5, 'med'); ''' )) conn.commit() log.info("数据插入操作执行成功") return True except Exception as e: log.error(f"插入数据失败: {str(e)}") raise # 抛出异常,让Airflow标记任务为失败,便于排查
3. 检查Airflow Worker的数据库访问
如果你的Airflow采用容器化部署(如Docker Compose),代码中的localhost对Worker容器来说指向容器内部,而非宿主机的PostgreSQL服务:
- 若PostgreSQL在宿主机,将连接串中的
localhost替换为宿主机的实际IP地址 - 若PostgreSQL也在容器中,使用Docker网络内的服务名替代
localhost
示例连接串(宿主机IP为192.168.1.100):
engine = create_engine("postgresql://postgres:123456@192.168.1.100:5433/main_base")
4. 验证任务执行日志
在Airflow UI中进入insert_data任务的详情页,查看任务日志:
- 若日志为空,说明任务未被Worker正确调度
- 若日志有错误信息,可直接根据提示定位问题
内容的提问来源于stack exchange,提问作者yooung pac
相关产品推荐
相关产品推荐

