Airflow Aiflow跳过单_成功触发规则上的任务

Airflow Aiflow跳过单_成功触发规则上的任务,airflow,airflow-scheduler,airflow-operator,Airflow,Airflow Scheduler,Airflow Operator,我使用的是one_success触发器规则,这样,如果父任务中的任何一个通过,那么子任务将按预期运行。然而,当两者都失败时,我就遇到了问题。在这种情况下,子任务将被跳过,而不是失败。下面是dag的实现 import logging from airflow import DAG from datetime import datetime, timedelta from airflow.operators.hive_operator import HiveOperator from airflow

我使用的是one_success触发器规则,这样,如果父任务中的任何一个通过,那么子任务将按预期运行。然而,当两者都失败时,我就遇到了问题。在这种情况下,子任务将被跳过,而不是失败。下面是dag的实现

import logging
from airflow import DAG
from datetime import datetime, timedelta
from airflow.operators.hive_operator import HiveOperator
from airflow.operators.bash_operator import BashOperator
from airflow.sensors.web_hdfs_sensor import WebHdfsSensor
from airflow.operators.dummy_operator import DummyOperator
from airflow.utils.trigger_rule import TriggerRule


circles = ['101','102','103']

def load_hive_partition(circle, **kwargs):

        return HiveOperator(
                    task_id='add_partition_{}'.format(circle),
                    hql='alter table abc.def add partition (event_date="{{ ds }}", circle="'+circle+'") location "/user/cloudera/hive/abc/def/event_date={{ ds }}/circle='+circle+'"',
                    trigger_rule=TriggerRule.ONE_SUCCESS,
                    dag=dag)

def check_hdfs_node1(circle, **kwargs):
    return WebHdfsSensor(
    task_id='source_data_sensor_node1_{}'.format(circle),
    webhdfs_conn_id='webhdfs_default_1',
    filepath='/user/cloudera/hive/abc/def/event_date={{ds}}/circle='+circle,
    timeout=60 * 60 * 24,
    dag=dag
)

def check_hdfs_node2(circle, **kwargs):
    return WebHdfsSensor(
    task_id='source_data_sensor_node2_{}'.format(circle),
    webhdfs_conn_id='webhdfs_default',
    filepath='/user/cloudera/hive/abc/def/event_date={{ds}}/circle='+circle,
    timeout=60 * 60 * 24,
    dag=dag
)

args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'run_as_user': 'airflow',
    'retries': 3,
    'start_date': datetime(year=2020, month=8, day=30),
    'retry_delay': timedelta(minutes=10)
}

dag = DAG(dag_id="HiveLoadPartition_circle",
          default_args=args,
          schedule_interval='30 18 * * *',
          catchup=False)

kinit_bash = BashOperator(
        task_id='kinit_bash',
        bash_command='kinit -kt /usr/local/airflow/keytab.keytab appuser@cloudera.com',
        dag=dag)



#start_dag = DummyOperator(task_id='start_dag', dag=dag)
end_dag = DummyOperator(task_id='end_dag',trigger_rule=TriggerRule.ALL_DONE, dag=dag)


for circle in circles:
    add_partition = load_hive_partition(circle)
    check_hdfs_1 = check_hdfs_node1(circle)
    check_hdfs_2 = check_hdfs_node2(circle)
    check_hdfs_1.set_upstream(kinit_bash)
    check_hdfs_2.set_upstream(kinit_bash)
    add_partition.set_upstream(check_hdfs_1)
    add_partition.set_upstream(check_hdfs_2)
    end_dag.set_upstream(add_partition)


图形视图

如果两个hdfs\U传感器都出现故障,如何使hiveload任务失败

更新:

我也尝试过使用触发器规则,所有这些都是在end dag中完成的。即使如此,当父任务跳过时,它也会触发end_dag


我遇到了同样的问题,我认为这是气流的一个潜在问题。我已打开以下PR来修复此问题

2021-05-04:修复程序已合并并标记为下一个()版本

2021-05-23:该修复程序已随的发行版一起部署(2.0.3已取消)

注意:我已经将删除的回复添加到元对话中,因为我没有评论元线程所需的50个声誉。浏览一下,它似乎没有资格删除,但如果我错过了什么,下面的内容不属于这里,请代表我将此响应移动到元线程,因为我无法删除


至于元对话:这个答案非常符合@Ivar的精神。因此,我的意图是,这个答案有助于Ayush和其他在使用时偶然发现这个问题的人,我认为这是不可能的-为什么你要尝试实现这个目标?您想发送失败电子邮件还是什么?您的dag未连接。此外,还有很多缺少的代码/输入错误-添加分区定义,检查hdfs 1。更正并更新问题。@PhilippJohannis,是的,如果两个分支都失败了,我必须使整个dag失败并发送电子邮件。@SuhasNM,用图形视图更新了正确的dag我尝试了您的代码,它正在按预期工作。结束任务状态为“上游失败”。我认为您可以通过解释错误以及如何修复来改进此答案。