我位于 UTC+4 时区,因此当 Airflow 触发夜间 ETL 时,这里已经是凌晨 4:00。如何告诉 Airflow 在 ds-1 天 20:00 触发 ds 天的运行,但 ds=ds?
根据文档,强烈建议将所有服务器保留在 UTC 上,因此这就是我寻找应用程序级解决方案的原因。
编辑:一个 hacky 解决方案是将其定义为每天晚上 20:00 运行,即“前一天”,但然后在工作。但这在 Airflow UI 上看起来仍然很奇怪,因为这将显示 UTC 执行时间。
最佳答案
计划间隔也可以是“cron 表达式”,这意味着您可以轻松地在 20:00 UTC 运行它。与“user_defined_filters”相结合意味着您可以通过一些技巧获得您想要的行为:
from airflow.models import DAG
from airflow.operators.bash_operator import BashOperator
from datetime import datetime
import pytz
tz = pytz.timezone('Asia/Dubai')
def localize_utc_tz(d):
return tz.fromutc(d)
default_args = {
'start_date': datetime(2017, 11, 8),
}
dag = DAG(
'plus_4_utc',
default_args=default_args,
schedule_interval='0 20 * * *',
user_defined_filters={
'localtz': localize_utc_tz,
},
)
task = BashOperator(
task_id='task_for_testing_file_log_handler',
dag=dag,
bash_command='echo UTC {{ ts }}, Local {{ execution_date | localtz }} next {{ next_execution_date | localtz }}',
)
输出:
UTC 2017-11-08T20:00:00, Local 2017-11-09 00:00:00+04:00 next 2017-11-10 00:00:00+04:00
您必须小心您使用的变量的“类型”。例如,ds
和 ts
是字符串,而不是日期时间对象,这意味着过滤器无法处理它们
关于airflow - 如何触发每日 DAG 在本地时间午夜而不是 UTC 时间午夜运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47112291/