Great Expectation设is_blocking=False验证失败仍中止,如何仅发通知不中断流程
你遇到的任务中止问题和Great Expectations(以下简称GE)侧的is_blocking: False配置无关,从报错栈可以看到,是你使用的自定义GreatExpectationsNotificationOperator在验证失败后主动抛出了AirflowException,才导致任务被标记为失败,下游任务无法执行。
解决方案
方案1:修改自定义Operator逻辑(推荐)
你可以直接修改great_expectations_notification_operator.py的代码,新增验证失败是否中止的控制开关:
- 在Operator的
__init__方法中新增参数fail_on_validation_error: bool = True,默认保持原有逻辑,兼容其他使用场景 - 调整
execute方法的异常抛出逻辑,仅当fail_on_validation_error为True时才抛出异常:
# 原代码(第79行附近) if not validation_passed: send_slack_notification(message) raise AirflowException(message) # 修改后代码 if not validation_passed: send_slack_notification(message) if self.fail_on_validation_error: raise AirflowException(message) self.log.info(f"数据验证失败,已发送通知,按配置不中止任务:{message}")
后续你需要仅通知不中止的任务,在初始化Operator时传入fail_on_validation_error=False即可。
方案2:无需修改代码,直接调整Airflow任务配置
如果没有修改Operator的权限,可以用Airflow原生参数实现需求:
- 给GE监控任务添加
soft_fail=True参数,该参数会将任务的所有失败状态转为跳过状态,不会标记为DAG运行失败 - 给下游任务设置
trigger_rule="none_failed",只要上游没有标记为失败的任务就会正常执行,上游任务为跳过状态不影响下游运行
注意:该方案会把GE任务的所有异常(包括代码错误、权限错误、查询超时等非验证失败的异常)都转为跳过状态,适合你确认GE任务不会出现验证失败以外的错误的场景。
方案3:切换为官方GE Operator
如果你当前用的是自定义Operator,也可以切换为Airflow官方提供的GreatExpectationsOperator,官方Operator原生支持fail_task_on_validation_failure参数,直接设置为False即可实现验证失败仅发通知、不中止任务的需求。
内容的提问来源于stack exchange,提问作者Jack Daniel
相关产品推荐
相关产品推荐

