当另一个任务成功完成时触发任务

时间:2019-06-19 14:04:55

标签: airflow

我的用例如下:

  • Task A使用某些输入的原始数据生成dataset
  • Task B使用dataset作为输入运行某些代码
  • Task C使用dataset作为输入运行其他代码

这三个任务计划每天运行,Task BTask C计划在Task A之后运行足够的时间,并且如果输入内容失败出于某种原因未生成数据集。

作为第一个改进,我在ExternalTaskSensorTask B中都添加了Task C,但这只是避免了Task A尚未完成或失败时运行它们。 / p>

但是,ExternalTaskSensor回填上似乎不能很好地工作(这非常脆弱,因为它仅依赖于执行日期,如果加上{{1 }}再次运行,Task ATask B不知道。)

解决方案1(不适用): 我已经看到了这样的问题:In airflow, is there a good way to call another dag's task?

这对我来说并不理想,因为我想让Task C 不了解相关任务,并处理Task ATask B中的逻辑(或外部)。原因是将来会(从组织中的不同团队)添加消耗Task C输出的其他任务,因此不希望每次都更新Task A

摘要 我想仅在成功执行Task A时(独立地手动调度或触发)Task B来触发Task CTask A,而无需修改Task A实现这一目标。

1 个答案:

答案 0 :(得分:0)

为适应您的情况,我能想到的唯一概念是SubDags。 (实施前请参阅警告)

SubDagOperator允许您将一组任务附加到task A上。请参阅下面的代码。

dag = DAG('parent_dag', description='Parent',
          schedule_interval='@daily',
          start_date=datetime.now())

task_a = DummyOperator(dag=dag, task_id='task_a')

subdag_task = SubDag(task_id='load_tasks',
    subdag=load_subdag('parent_dag', 'dependent_tasks'),
    dag=dag)

task_a >> subdag_task

现在在单独的文件中定义load_subdag函数。

def load_subdag(parent_dag_name, child_dag_name):
    dag_subdag = DAG(
        dag_id='{0}.{1}'.format(parent_dag_name, child_dag_name),
        schedule_interval="@daily",
    )
    with dag_subdag:
        task_b = DummyOperator(
            task_id='load_subdag_task_b',
            dag=dag_subdag)

       task_c = DummyOperator(
            task_id='load_subdag_task_c',
            dag=dag_subdag)

    return dag_subdag

警告(红色和粗体显示):SubDag任务像like一样占用工作人员中的插槽。在跳到此之前,请先完全了解警告。 AIRFLOW-74展示了情况有多糟。出于相同的原因,它被许多开发人员完全拒绝。