乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
airflow使用问题集锦 | chenzuoli's blog

airflow使用问题集锦

记录一下airflow使用过程中的一些问题和经验

  1. ValueError: naive datetime is disallowed

naive datetime是不带时区的时间,在airflow里面是不支持的,我们要将naive datetime转换为本地时区时间

1
2
3
4
5
6
7
from datetime import datetime
import pytz

tz = pytz.timezone('Asia/Shanghai')
naive_dt = datetime(2020, 10, 5, 15, 0, 0)
utc_dt = tz.localize(naive_dt, is_dst=None)
# -> 2020-10-05 22:00:00+00:00

–20221113
2. dag定义文件中的start_date,可以影响任务的调度时区
看源码airflow/models/dag.py:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# set timezone from start_date
tz = None
if start_date and start_date.tzinfo:
tzinfo = None if start_date.tzinfo else settings.TIMEZONE
tz = pendulum.instance(start_date, tz=tzinfo).timezone
elif 'start_date' in self.default_args and self.default_args['start_date']:
date = self.default_args['start_date']
if not isinstance(date, datetime):
date = timezone.parse(date)
self.default_args['start_date'] = date
start_date = date

tzinfo = None if date.tzinfo else settings.TIMEZONE
tz = pendulum.instance(date, tz=tzinfo).timezone
self.timezone = tz or settings.TIMEZONE

所以有4个可以设置时区的地方:
a. airflow.cfg [core]下面的default_timezone
b. airflow.cfg [webserver]下面的default_timezone
c. airflow web UI右上角
d. airflow dag定义文件中的start_date

1
2
from datetime import datetime
my_dag = DAG("test_start_date", start_date=datetime(2021, 1, 1), schedule="0 4 * * *", catchup=False)

如果start_date没有设置timezone,则使用utc

1
2
import pendulum
my_dag = DAG("checkoperator_test", start_date=pendulum.datetime(2021, 1, 1, tz="Asia/Shanghai"),

也可以指定时区

ok,下次碰到问题了,继续记录下来。

-------------本文结束感谢您的阅读-------------