You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 22:07:39