我有两个 DAG:
DAG_A、DAG_B。
DAG_A 通过 TriggerDagRunOperator 触发 DAG_B。
我在 DAG_B 中的任务:
with DAG(
dag_id='DAG_B',
default_args=default_args,
schedule_interval='@once',
description='ETL pipeline for processing users'
) as dag:
start = DummyOperator(
task_id='start')
delete_xcom_task = PostgresOperator(
task_id='clean_up_xcom',
postgres_conn_id='postgres_default',
sql="delete from xcom where dag_id='DAG_A' and task_id='TASK_A' ")
end = DummyOperator(
task_id='end')
#trigger_rule='none_failed')
#num_table is set by DAG_A. Will have an empty list initially.
iterable_string = Variable.get("num_table",default_var="[]")
iterable_list = ast.literal_eval(iterable_string)
for index,table in enumerate(iterable_list):
table = table.strip()
read_src1 = PythonOperator(
task_id=f'Read_Source_data_{table}',
python_callable=read_src,
op_kwargs={'index': index}
)
upload_file_to_directory_bulk1 = PythonOperator(
task_id=f'ADLS_Loading_{table}',
python_callable=upload_file_to_directory_bulk,
op_kwargs={'index': index}
)
write_Snowflake1 = PythonOperator(
task_id=f'Snowflake_Staging_{table}',
python_callable=write_Snowflake,
op_kwargs={'index': index}
)
task_sf_storedproc1 = DummyOperator(
task_id=f'Snowflake_Processing_{table}'
)
start >> read_src1 >> upload_file_to_directory_bulk1 >> write_Snowflake1 >>task_sf_storedproc1 >> delete_xcom_task >> end
执行 airflow db init
并启动网络服务器和调度程序后,DAG_B 失败,任务 delete_xcom_task 失败。
2021-06-22 08:04:43,647] {taskinstance.py:871} INFO - Dependencies not met for <TaskInstance: Target_DIF.clean_up_xcom 2021-06-22T08:04:27.861718+00:00 [queued]>, dependency 'Trigger Rule' FAILED: Task's trigger rule 'all_success' requires all upstream tasks to have succeeded, but found 2 non-success(es). upstream_tasks_state={'total': 2, 'successes': 0, 'skipped': 0, 'failed': 0, 'upstream_failed': 0, 'done': 0}, upstream_task_ids={'Snowflake_Processing_products', 'Snowflake_Processing_inventories'}
[2021-06-22 08:04:43,651] {local_task_job.py:93} INFO - Task is not able to be run
但是两个 DAG 在第二次运行后都成功了。
谁能解释一下内部发生了什么?
如何避免第一次运行失败?
谢谢。
答案 0 :(得分:0)
我怀疑问题出在 schedule_interval='@once'
的 DAG_B
中:当您第一次添加 DAG 时,schedule_interval
会告诉调度程序运行 DAG 一次。因此,DAG_B
由调度程序触发一次,而不是由 DAG_A
触发。 DAG_A
需要为 DAG_B
成功运行所做的任何准备工作尚未完成,因此 DAG_B
失败。
稍后,DAG_A
按计划运行并按预期触发 DAG_B
。两者都成功了。
为了避免 DAG_B
被调度程序集 schedule_interval=None
触发。