动态创建任务列表

时间:2017-07-15 15:44:31

标签: airflow apache-airflow

我有一个DAG,它是通过查询DynamoDB获取列表而创建的,并且对于列表中的每个项目,使用PythonOperator创建任务并将其添加到DAG。不在下面的示例中显示,但重要的是要注意列表中的某些项目取决于其他任务,因此我使用set_upstream来强制执行依赖项。

- airflow_home
  \- dags
    \- workflow.py

workflow.py

def get_task_list():
    # ... query dynamodb ...

def run_task(task):
    # ... do stuff ...

dag = DAG(dag_id='my_dag', ...)
tasks = get_task_list()
for task in tasks:
    t = PythonOperator(
        task_id=task['id'],
        provide_context=False,
        dag=dag,
        python_callable=run_task,
        op_args=[task]
    )

问题是workflow.py反复运行(每次运行任务?),我的get_task_list()方法受到AWS的限制并抛出异常。

我认为这是因为无论何时调用run_task()它都会在workflow.py中运行所有全局变量,所以我尝试将run_task()移动到一个单独的模块中:

- airflow_home
  \- dags
    \- workflow.py
    \- mypackage
      \- __init__
      \- task.py

但它并没有改变任何事情。我甚至尝试将get_task_list()放入包含工厂函数的SubDagOperator中,该函数的行为方式仍然相同。

我的问题与这些问题有关吗?

此外,为什么workflow.py经常运行,为什么get_task_list()引发的错误会导致单个任务失败,而任务方法不会引用workflow.py和没有依赖它?

最重要的是,并行处理列表并强制执行列表中项之间的任何依赖关系的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

根据您引用的问题,当dag运行时,airflow不支持创建任务。

因此,气流会在开始运行之前定期生成完整的DAG定义。理想情况下,此类生成的周期应与该DAG的计划间隔相同。

但是可能每次气流检查dag的变化时,它也会产生完整的dag,导致请求过多。使用airflow.cfg中的配置min_file_process_interval和dag_dir_list_interval控制该时间。

关于任务失败,它们会失败,因为dag创建本身失败并且气流无法启动它们。