Apache airflow宏获取上一次dag运行的执行时间

时间:2018-08-20 03:05:23

标签: python airflow

我认为列出的hereprev_execution_date将为我提供上一次DAG运行的执行日期,但是查看源代码,似乎只能得到基于DAG时间表的最后日期。

prev_execution_date = task.dag.previous_schedule(self.execution_date)

当DAG未按计划运行时,是否可以通过宏获取DAG的执行日期?

2 个答案:

答案 0 :(得分:3)

是的,您可以为此定义自己的自定义宏,如下所示:

# custom macro function
def get_last_dag_run(dag):
    last_dag_run = dag.get_last_dagrun()
    if last_dag_run is None:
        return "no prev run"
    else:
        return last_dag_run.execution_date.strftime("%Y-%m-%d")

# add macro in user_defined_macros in dag definition
dag = DAG(dag_id="my_test_dag",
      schedule_interval='@daily',
      user_defined_macros={
          'last_dag_run_execution_date': get_last_dag_run
      }
)

# example of using it in practice
print_vals = BashOperator(
    task_id='print_vals',
    bash_command='echo {{ last_dag_run_execution_date(dag) }}',
    dag=dag
)

请注意,dag.get_last_run()只是Dag对象上可用的众多功能之一。我在这里找到它的地方:https://github.com/apache/incubator-airflow/blob/v1-10-stable/airflow/models.py#L3396

您还可以调整日期格式的字符串格式,以及如果以前没有运行,则要输出的内容。

答案 1 :(得分:0)

您可以创建自己的用户自定义宏功能,使用气流模型搜索元数据库。

def get_last_dag_run(dag_id):
  //TODO search DB
  return xxx

dag = DAG(
    'example',
    schedule_interval='0 1 * * *',
    user_defined_macros={
        'last_dag_run_execution_date': get_last_dag_run,
    }
)

然后在模板中使用KEY。