Parallel processing 气流任务在池1和并发4的情况下失败

Parallel processing 气流任务在池1和并发4的情况下失败,parallel-processing,airflow,pool,Parallel Processing,Airflow,Pool,感谢任何能为我们指明正确方向的人的帮助 我们有一个气流池配置,我们计划将mariaDB上API调用的并发性限制为1,这样就不会使数据库过载。 我们的主要目标是并行处理不需要节流的任务,以便提高日常ETL的速度 为此,我们将replica_db的池插槽设置为1,如下图所示 在下面的dag图中,我们打算将前两个任务设置为使用replica_db slot # #===================================== # # JOB TASKS # #===============

感谢任何能为我们指明正确方向的人的帮助

我们有一个气流池配置,我们计划将mariaDB上API调用的并发性限制为1,这样就不会使数据库过载。 我们的主要目标是并行处理不需要节流的任务,以便提高日常ETL的速度

为此,我们将replica_db的池插槽设置为1,如下图所示 在下面的dag图中,我们打算将前两个任务设置为使用replica_db slot

# #=====================================
# # JOB TASKS
# #=====================================

for TBL in LIST_OF_TABLES:
    prepare_sql                         =       bash_templateV2('prepare_sql',TBL,'replica_db')
    extract_lalafood_prod_replica       =       bash_templateV2('extract_lalafood_prod_replica',TBL,'replica_db')
    load_to_s3                          =       bash_templateV2('load_to_s3',TBL,'default_pool')
    copy_to_dwh_staging                 =       bash_templateV2('copy_to_dwh_staging',TBL,'default_pool')
    insert_to_dwh_production            =       bash_templateV2('insert_to_dwh_production',TBL,'default_pool')
    delete_csv                          =       bash_templateV2('delete-csv',TBL,'default_pool')

    #=====================================
    # DEPENDENCY GRAPH
    #=====================================

    prepare_sql >> extract_lalafood_prod_replica >> load_to_s3  >> delete_csv >> copy_to_dwh_staging >> insert_to_dwh_production
DAG图是这样的。下面的示例仅显示了3个主要任务,但实际上不止这些,因为它代表了我们从DB中提取的一个表。

当我们启动自动化时,会出现一个错误,指出任务失败是因为没有插槽。我们似乎无法理解这一点。

气流不把任务放在队列中等待吗?为什么它会将其标记为失败?我们的假设是,因为我们只设置了1个插槽,所以由于我们的并发设置,airflow仍然会一次尝试执行4个任务。我们如何解决此问题,使前两个任务不会失败,并在队列中等待,直到副本数据库池插槽打开,然后再继续下一个任务节点

这是我们的dag设置

# These args will get passed on to each operator
# You can override them on a per-task basis during operator initialization
default_args = {
    'depends_on_past': False,
    'start_date': STATIC_DATE,
#     'email_on_failure': True,
#     'email_on_retry': True,
    'retries': 3,
    'retry_delay': timedelta(minutes=5),
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
    # 'wait_for_downstream': True,    
    # 'dag': dag,
    'sla': timedelta(hours=2),
    'execution_timeout': None,#timedelta(seconds=300),
#    'email_on_failure': True,
    'email_on_retry': False,
    # 'on_failure_callback': some_function,
    # 'on_success_callback': some_other_function,
    # 'on_retry_callback': another_function,
    # 'trigger_rule': u'all_success'
}

dag = DAG(
    dag_id = '{}__EngFlix__prod_replica_v2B__start_{}'.format(STAGE.upper(),STATIC_DATE.date()),
    catchup=False,
    default_args=default_args,
    description='Data stream service for prod preplica to redshift',
    schedule_interval=CRON_SCHEDULE,
    max_active_runs=1,
    concurrency=4
)

def bash_templateV2(STEP,TABLE_ID,POOL):
  return BashOperator(task_id="{}-{}".format(STEP,TABLE_ID),
                      bash_command=EXE_PATH+"{} {} {}".format(EXECUTION_TIME_PLACEHOLDER,STEP,TABLE_ID),
                      pool=POOL,
                      dag=dag
                      )