我可以在气流计划中添加延迟吗?

时间:2018-11-30 20:43:55

标签: airflow

我有一条每天要运行的管道,但我希望执行日期滞后。也就是说,在第X天,我希望执行日期为X-3。这样有可能吗?

2 个答案:

答案 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天,然后在管道逻辑中使用结果。气流提供了多种实现方法:

  1. Templates: {{ execution_date - macros.timedelta(days=3) }}。因此,例如,BashOperator的bash_command参数可以是bash_command='echo Processing date: {{ execution_date - macros.timedelta(days=3) }} '
  2. The PythonOperator's python callable:定义诸如def func(execution_date, **kwargs): ...之类的可调用对象,并设置PythonOperator的参数provide_context=Trueexecution_date的{​​{1}}参数将被设置为调用时的当前执行日期(func()对象)。因此,在datetime内部,您可以进行func()
  3. The Sensors' context parameter:任何传感器的processing_date = execution_date - timedelta(days=3)poke()方法都具有execute()参数,这是所有包含context的宏的指令。因此,在这些方法中,您可以执行execution_date

强迫执行日期滞后根本感觉不对。因为,按照Airflow的逻辑,当前运行的DAG的执行日期通常只有在赶上(填充)时才会有延迟。