我的用例如下:
Task A
使用某些输入的原始数据生成dataset
Task B
使用dataset
作为输入运行某些代码Task C
使用dataset
作为输入运行其他代码这三个任务计划每天运行,Task B
和Task C
计划在Task A
之后运行足够的时间,并且如果输入内容失败出于某种原因未生成数据集。
作为第一个改进,我在ExternalTaskSensor
和Task B
中都添加了Task C
,但这只是避免了Task A
尚未完成或失败时运行它们。 / p>
但是,ExternalTaskSensor
在回填上似乎不能很好地工作(这非常脆弱,因为它仅依赖于执行日期,如果加上{{1 }}再次运行,Task A
和Task B
不知道。)
解决方案1(不适用): 我已经看到了这样的问题:In airflow, is there a good way to call another dag's task?
这对我来说并不理想,因为我想让Task C
不了解相关任务,并处理Task A
和Task B
中的逻辑(或外部)。原因是将来会(从组织中的不同团队)添加消耗Task C
输出的其他任务,因此不希望每次都更新Task A
。
摘要
我想仅在成功执行Task A
时(独立地手动调度或触发)Task B
来触发Task C
和Task A
,而无需修改Task A
实现这一目标。
答案 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展示了情况有多糟。出于相同的原因,它被许多开发人员完全拒绝。