我正在尝试使用ExternalTaskSensor添加交叉dag依赖性,但无法使其正常工作。 Dag A具有schedule_interval=None
,因为它没有固定的时间表,并由文件创建事件在外部触发。 Dag A完成后,Dag B应该执行。这是dag_a和dag_b的代码。
DAG A
default_args = {
'depends_on_past': False,
'start_date': datetime.today()-timedelta(1),
'email_on_failure': True,
'email_on_retry': False,
'queue': 'default'
}
dag = DAG(
'dag_a', default_args=default_args, schedule_interval=None)
dag_a = AWSBatchOperator(
task_id='dag_a',
job_name='dag_a',
job_definition='dag_a',
job_queue='MyAWSJobQueue',
max_retries=10,
aws_conn_id='aws_conn',
region_name='us-east-1',
dag=dag,
parameters={},
overrides={})
DAG B
default_args = {
'depends_on_past': False,
'start_date': datetime.today()-timedelta(1),
'email_on_failure': True,
'email_on_retry': False,
'queue': 'default'
}
dag = DAG(
'dag_b', default_args=default_args, schedule_interval=None)
dag_b = AWSBatchOperator(
task_id='dag_b',
job_name='dag_b',
job_definition='dag_b',
job_queue='MyAWSJobQueue',
max_retries=10,
aws_conn_id='aws_conn',
region_name='us-east-1',
dag=dag,
parameters={},
overrides={})
wait_for_dag_a = ExternalTaskSensor(
task_id='wait_for_irr',
external_dag_id='dag_a',
external_task_id=None,
execution_delta = timedelta(hours=1),
dag=dag,
timeout = 300)
dag_b.set_upstream(wait_for_dag_a)
我同时设置了schedule_interval=None
和相同的start_date
这两个dag。我甚至为dag_b添加了execution_delta = timedelta(hours=1)
,但dag_a已完成,但dag_b尚未触发。任何帮助表示赞赏。
我尝试使用有效的TriggerDagRunOperator
,但不适合我的用例,因为dag_b最终将依赖于多个父dag。
答案 0 :(得分:0)
我之前遇到过类似的问题,因此需要检查两件事,首先,我看不到DAG A和DAG B之间的任何时间增量,它们都使用默认的arg,因此您不应该给等待的任务一个execute_delta,对于气流触发,如果有多个父DAG,它就无法检测到DAG结束信号,因此我尝试给external_task_id赋一个值,例如'dag_a-done'而不是默认的'None',并且可以。还有一件事要提到,task_id通常不应包含下划线。 链接是外部传感器的源代码: https://airflow.apache.org/docs/stable/_modules/airflow/sensors/external_task_sensor.html 此外,还有一篇文章介绍了ExternalTaskSensors的工作方式: https://medium.com/@fninsiima/sensing-the-completion-of-external-airflow-tasks-827344d03142