我有一个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_callback
和on_success_callback
来处理dag状态并调用自定义方法?
答案 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_msg
和success_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标志级别应用属性