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