我有一条每天要运行的管道,但我希望执行日期滞后。也就是说,在第X
天,我希望执行日期为X-3
。这样有可能吗?
答案 0 :(得分:0)
您可以使用TimeSensor来延迟DAG中任务的执行。我认为除非您可以将行为描述为cron,否则您无法更改实际的execution_date
。
如果您希望仅将此延迟应用于计划的DAG运行的子集,则可以使用BranchPythonOperator首先检查execution_date
是否是您想要延迟的日子之一。如果是这样,则带传感器分支。否则,请继续前进。
或者,特别是如果您计划在多个DAG中具有此行为,则可以编写传感器的修改版本。它可能看起来像这样:
def poke(self, context):
if should_delay(context['execution_date']):
self.log.info('Checking if the time (%s) has come', self.target_time)
return timezone.utcnow().time() > self.target_time
else:
self.log.info('Not one of those days, just run')
return True
您可以在https://github.com/apache/incubator-airflow/blob/1.10.1/airflow/sensors/time_sensor.py#L38-L40中引用现有时间传感器的代码。
答案 1 :(得分:0)
您似乎在管道逻辑中使用execution_date
作为变量。例如,处理早于execution_date
3天的数据。因此,您可以从execution_date
中减去延迟,而不用使execution_date
滞后3天,然后在管道逻辑中使用结果。气流提供了多种实现方法:
{{ execution_date - macros.timedelta(days=3) }}
。因此,例如,BashOperator的bash_command
参数可以是bash_command='echo Processing date: {{ execution_date - macros.timedelta(days=3) }} '
def func(execution_date, **kwargs): ...
之类的可调用对象,并设置PythonOperator的参数provide_context=True
。 execution_date
的{{1}}参数将被设置为调用时的当前执行日期(func()
对象)。因此,在datetime
内部,您可以进行func()
。context
parameter:任何传感器的processing_date = execution_date - timedelta(days=3)
和poke()
方法都具有execute()
参数,这是所有包含context
的宏的指令。因此,在这些方法中,您可以执行execution_date
。强迫执行日期滞后根本感觉不对。因为,按照Airflow的逻辑,当前运行的DAG的执行日期通常只有在赶上(填充)时才会有延迟。