Airflow Python任务调用异步parse_pdf包出现异常,求排查原因
结合你使用LocalExecutor+MySQL的环境,以及引入异步优先的parse_pdf包后出现的错误,以下是几个可能的根本原因:
异步代码未正确适配同步执行环境
parse_pdf是异步优先的包,而Airflow LocalExecutor默认以同步方式运行任务。直接调用异步函数会导致事件循环未初始化,任务进程陷入阻塞状态,Executor长时间无法获取任务状态更新,会判定任务异常并标记为失败。解决方式是用asyncio.run()显式运行异步逻辑:import asyncio # ... pages = asyncio.run(parse_pdf(pdf_fpath))数据库连接状态不一致
LocalExecutor下多个任务进程共享MySQL连接池,若parse_pdf的API调用耗时过长,可能导致数据库连接超时被回收,Airflow无法正常更新任务状态,出现"任务显示queued但Executor报告failed"的矛盾情况。可以调整Airflow配置:- 调大
sql_alchemy_pool_size增加连接池容量 - 缩短
sql_alchemy_pool_recycle时间,避免连接超时
- 调大
任务进程被系统资源限制强制杀死
如果parse_pdf的API调用占用过高内存或CPU,本地系统的OOM Killer(内存不足时杀死进程)或资源限制会直接终止任务进程,Airflow无法收到正常的任务结束信号,从而出现状态异常。可以检查系统日志(比如Linux的/var/log/syslog)确认是否有进程被杀死的记录。异步包与Executor的进程管理冲突
部分异步包会自行创建线程或子进程,和LocalExecutor的进程管理逻辑冲突,导致任务进程的状态无法被Airflow正确追踪。可以尝试改用Airflow的异步任务装饰器@task.async()(Airflow 2.x版本支持),让任务以异步模式运行,适配异步优先的依赖包。
内容的提问来源于stack exchange,提问作者Fares

