Mar*_*eni 7 airflow apache-airflow airflow-scheduler
我在UTC + 4时区,所以当Airflow触发夜间ETL时,它已经是凌晨4点了.如何告诉Airflow在20:00的ds-1日触发日ds的运行,但ds = ds?
根据文档,强烈建议将所有服务器保留在UTC上,这就是我正在寻找应用程序级解决方案的原因.
编辑:一个hacky解决方案是定义它每天晚上20:00运行,所以"前一天",但然后使用tomorrow_ds而不是ds在工作中.但是在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 }}',
)
Run Code Online (Sandbox Code Playgroud)
这输出:
UTC 2017-11-08T20:00:00,本地时间2017-11-09 00:00:00 + 04:00下一个2017-11-10 00:00:00 + 04:00
你必须要小心你使用的变量的"类型".例如ds,ts是字符串,而不是日期时间对象,这意味着过滤器不会对它们起作用
您可以编写一个 python 实用程序,将基于 tz 的时间表重写为 UTC? https://github.com/bloomberg/tzcron/blob/master/tzcron.py
编辑:最近的提交使 Airflow Timezone 意识到: https://github.com/apache/incubator-airflow/commit/f1ab56cc6ad3b9419af94aaa333661c105185883
| 归档时间: |
|
| 查看次数: |
3132 次 |
| 最近记录: |