最近,我对气流进行了大量测试,在运行execution_date
时airflow trigger_dag <my-dag>
出现了一个问题。
我了解到execution_date
不是我们第一次从here想到的:
Airflow是作为ETL需求的解决方案而开发的。在ETL世界中, 您通常会汇总数据。所以,如果我想总结一下数据 2016-02-19,我会在格林尼治标准时间2016-02-20午夜进行,这将是 在2016-02-19的所有数据可用之后。
start_date = datetime.combine(datetime.today(),
datetime.min.time())
args = {
"owner": "xigua",
"start_date": start_date
}
dag = DAG(dag_id="hadoopprojects", default_args=args,
schedule_interval=timedelta(days=1))
wait_5m = ops.TimeDeltaSensor(task_id="wait_5m",
dag=dag,
delta=timedelta(minutes=5))
以上代码是我日常工作流程的开始部分,第一项任务是TimeDeltaSensor,在实际工作前等待另外5分钟,这意味着我的dag将在2016-09-09T00:05:00
,2016-09-10T00:05:00
处触发。 ..等等。
在网络用户界面中,我可以看到类似scheduled__2016-09-20T00:00:00
的内容,任务在2016-09-21T00:00:00
运行,根据ETL
模型,这似乎是合理的。
但是有一天我的dag没有因未知原因被触发,所以我手动触发它,如果我在2016-09-20T00:10:00
触发它,那么TimeDeltaSensor会等到2016-09-21T00:15:00
才能运行。
这不是我想要的,我希望它在2016-09-20T00:15:00
运行而不是第二天,我尝试将execution_date
传递给--conf '{"execution_date": "2016-09-20"}'
,但它不起作用
我该如何处理这个问题?
$ airflow version
[2016-09-21 17:26:33,654] {__init__.py:36} INFO - Using executor LocalExecutor
____________ _____________
____ |__( )_________ __/__ /________ __
____ /| |_ /__ ___/_ /_ __ /_ __ \_ | /| / /
___ ___ | / _ / _ __/ _ / / /_/ /_ |/ |/ /
_/_/ |_/_/ /_/ /_/ /_/ \____/____/|__/
v1.7.1.3
答案 0 :(得分:23)
首先,我建议您使用start_date
的常量,因为动态的常量会根据您的气流管道进行不可预测的行为由调度程序进行评估。
有关start_date
的更多信息,请参阅我编写的常见问题解答条目并对其进行排序:
https://airflow.apache.org/faq.html#what-s-the-deal-with-start-date
现在,关于execution_date
,当它被触发时,这是人们在Airflow上登机的常见问题。气流根据它所覆盖的计划周期的左边界设置execution_date
,而不是基于它何时触发(这将是该期间的右边界)。例如,当运行schedule='@hourly'
任务时,任务将每小时触发一次。下午2点发出的任务将有execution_date
下午1点,因为它假设您正在下午2点处理下午1点到下午2点的时间窗口。同样,如果您运行的是每日作业,execution_date
2016-01-01
的{{1}}运行将在2016-01-02
午夜后不久触发。
这个左边标记在考虑ETL和差异负载方面很有意义,但在考虑简单的类似cron的调度程序时会让人感到困惑。
答案 1 :(得分:1)
Airflow将提供UTC时间。我不确定你在什么时区运行任务。因此,请确保您考虑UTC时区并相应地安排或触发作业。
尝试将您想要触发的时间转换为UTC时间并触发DAG。有用。有关详细信息,请阅读以下链接
https://cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls