气流-处理DAG回调的正确方法

时间:2018-07-03 06:17:08

标签: python airflow airflow-scheduler

我有一个DAG,然后无论成功还是失败,我都希望它触发一个发布到Slack的方法。

我的DAG args如下:

default_args = {
    [...]
    'on_failure_callback': slack.slack_message(sad_message),
    'on_success_callback': slack.slack_message(happy_message),
    [...]
}

还有DAG定义本身:

dag = DAG(
    dag_id = dag_name_id,
    default_args=default_args,
    description='load data from mysql to S3',
    schedule_interval='*/10 * * * *',
    catchup=False
      )

但是,当我检查Slack时,每分钟有100条以上的消息,就好像在每个调度程序的脉动信号上进行评估一样,对于每条日志,它确实运行了成功和失败方法,就好像它对同一任务有效而对无效实例(不好)。

我应该如何正确使用on_failure_callbackon_success_callback来处理dag状态并调用自定义方法?

3 个答案:

答案 0 :(得分:7)

创建消息的原因是因为在定义default_args时,您正在执行函数。您只需要传递函数定义而不执行它。

由于该函数具有参数,因此会变得有些棘手。您可以定义两个部分函数,​​也可以定义两个包装函数。

因此您可以执行以下操作:

from functools import partial

success_msg = partial(slack.slack_message, happy_message);
failure_msg = partial(slack.slack_message, sad_message);

default_args = {
    [...]
    'on_failure_callback': failure_msg
    'on_success_callback': success_msg
    [...]
}

def success_msg():
    slack.slack_message(happy_message);

def failure_msg():
    slack.slack_message(sad_message);

default_args = {
    [...]
    'on_failure_callback': failure_msg
    'on_success_callback': success_msg
    [...]
}

在两种方法中,请注意仅传递函数定义failure_msgsuccess_msg,而不传递它们在执行时给出的结果。

答案 1 :(得分:0)

您指的是slack方法?调度程序会在每次心跳时解析您的DAG文件,因此,如果您的代码中定义了slack一些函数,它将在每次心跳时都运行。

您可以尝试一些操作:

  • 定义要作为PythonOperators调用的函数,然后在任务级别而不是DAG级别调用它们。

  • 您还可以使用TriggerRules在ETL任务的下游设置任务,该任务将基于父任务的失败或成功而触发。

From the docs defines the rule by which dependencies are applied for the task to get triggered. Options are: { all_success | all_failed | all_done | one_success | one_failed | dummy}

您可以找到一个here外观的示例(完整披露-我是作者)。

答案 2 :(得分:0)

default_args在任务级别扩展,因此它成为每个任务回调

在“ default_args”之外的DAG标志级别应用属性