初始运行期间 DAG 失败

时间:2021-06-22 08:08:26

标签: airflow

我有两个 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 在第二次运行后都成功了。

谁能解释一下内部发生了什么?

如何避免第一次运行失败?

谢谢。

1 个答案:

答案 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 触发。

相关问题