本文主要总结本人在阅读Airflow源码后一些理解
1、airflow.models.taskinstance.py
关于execution_date

如上图,因为某个DAG任务中使用xcom,所以在xcom db中看到了上面这条数据,惊讶的发现其execution_date
竟然是本地时区(北京/上海 UTC+8)的显式,而不是一般的UTC时间,按原有理解应该是“2021-04-21T17:00:00+00:00”,如下图Task Instance中
在我的airflow中,基本所有时间都是以UTC为主,所以我对上面这种现象很疑惑,为什么执行前的execution_date
就是UTC时区,而执行完成就变成了系统当前时区(这里UTC+8)?
在taskinstance.py的__init__
找到了答案!

其中,无论task.has_dag
是否true,最终都会被convert_to_utc转换为UTC时间,这也就是为什么我们在Task Instance中看到execution_date
变量值为UTC时间
说明:
task.has_dag
是判断Operator是否已分配DAG。timezone.make_aware
无论传入task.dag.timezone
还是不传,在这里都是一样的,因为task.dag.timezone
和不传的情况,最终时区都是对应settings.TIMEZONE
,而这个变量也是取得airflow的配置项,如下图,因为“default_timezone”一般会配置成和系统时区一致,就算不配,默认也是取系统时区,如UTC+8。所以这里,无论task.has_dag
结果是啥,if else执行后的execution_date
是一样的。
待继续理解,补充。。。。
发表评论