Airflow手动触发Dag之后,20分钟才会执行,Scheduler设置为None

最近项目需要每日同步数据,使用了Airflow进行任务调度,在使用过程中发现,Airflow还是非常好使的,并且部署也很简单。

在使用过程中还是碰到一些问题

1,默认数据库配置是sqlite数据库,切换成oracle数据库之后,发现数据库初始化失败,根据报错发现,airflow中有一些表的定义超过oracle11的30个字符长度限制导致初始化数据库失败,可以换成oracle12以上的版本或者使用mysql,因为我们环境中有mysql数据库,最后使用了mysql数据库

2,mysql数据库在初始化过程中也报错了,update_dt不能为空,因为数据库的严格限制导致的,需要设置下mysql的sqlmode,去掉严格限制的模式,设置成一下模式后,运行成功

SET GLOBAL sql_mode='ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

3,可是当把Airflow从测试环境迁移到生产环境的时候出问题了,发现手动触发的dags过20分钟后才能运行,问了下deepseek给出一些建议,挨个试了之后发现并不能解决问题。实在没有解决方案了,决定看下scheduler的源码,看下dag从queued状态如何变化到Running的状态,

研究了下scheduler_job_runner,py文件,从queued状态到running状态有那些限制,最后发现这句代码

if not settings.ALLOW_FUTURE_EXEC_DATES:
query = query.where(DagRun.execution_date <= func.now())

对应的这个配置项allow_trigger_in_future恰好设置了False,设置为True之后,就能实时触发了,算是解决问题了,但是为什么呢?明明execution_date和触发时间是一样的,肯定是func.now的时间不对了,func.now的时间用的是airflow使用的mysql数据库所有的系统的系统时间,上去系统看了下,果然这个系统的系统时间慢了20分钟,调整了系统时间之后,恢复allow_trigger_in_future原来的设置,问题彻底解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值