Airflow backfill任务卡在queued状态无法自动执行的问题排查
嘿,我来帮你看看这个回填任务卡住的问题,从你的配置和日志来看,主要有几个关键问题需要调整:
1. start_date 与回填时间不匹配
你的DAG起始日期设为了2018-05-01,但你要回填的是2016-04-01至2016-05-01——这个时间早于DAG的start_date,Airflow默认不会处理早于起始日期的任务,哪怕你用backfill命令指定了时间范围,任务也不会被正常触发执行。这是导致任务卡在队列里的核心原因之一。
2. catchup_by_default 配置放错地方了
catchup_by_default不是default_args里的参数哦,它是DAG初始化时的专属参数。你把它放在default_args里完全起不到作用,正确的写法应该是这样:
dag = DAG( 'test_backfill', default_args=default_args, schedule_interval='0 5 1 * *', dagrun_timeout=timedelta(hours=2), catchup=False # 移到这里才对 )
不过这个参数主要控制自动补全历史任务,用backfill命令时会忽略它,但配置位置错误可能引发一些预期外的行为,还是修正为好。
3. Celery Executor的运行状态问题
从日志能看到,Celery已经把任务加入队列了,但任务一直卡在queued状态,还报了"Executor reports task instance finished (failed) although the task says its queued"的错误,这大概率和Celery Worker有关:
- 先确认Celery Worker有没有正常启动,运行
airflow celery worker看看能不能正常启动Worker进程 - 检查Broker(比如Redis或者RabbitMQ)的连接是否正常,Airflow主节点和Worker都得能连上Broker才行
- 可以看看Worker的日志,里面应该会有任务执行失败的具体原因,比主节点日志更详细
具体修复步骤
- 调整
start_date到回填时间之前:把default_args里的start_date改成早于2016-04-01,比如:
'start_date': datetime(2016, 3, 1),
这样Airflow才会认为这个时间范围内的任务是合法的可执行任务。
修正
catchup参数的位置:把default_args里的catchup_by_default删掉,放到DAG初始化参数里(就像上面的代码示例那样)。检查并重启Celery相关服务:确保Broker正常运行,Worker进程处于活跃状态,必要时重启Worker。
重新执行回填命令:先停掉之前的backfill进程,然后重新运行:
airflow backfill -s 2016-04-01 -e 2016-05-01 -I -m test_backfill
如果只是临时测试,你也可以在backfill命令里加--ignore-dependencies参数跳过依赖检查,但生产环境还是建议从配置本身修复问题哦。
内容的提问来源于stack exchange,提问作者prideloki

