Airflow 动态创建任务列表
我有一个DAG,它是通过查询DynamoDB中的列表创建的,对于列表中的每个项目,使用PythonOperator创建一个任务并将其添加到DAG中。在下面的示例中没有显示,但需要注意的是,列表中的某些项依赖于其他任务,因此我使用Airflow 动态创建任务列表,airflow,apache-airflow,Airflow,Apache Airflow,我有一个DAG,它是通过查询DynamoDB中的列表创建的,对于列表中的每个项目,使用PythonOperator创建一个任务并将其添加到DAG中。在下面的示例中没有显示,但需要注意的是,列表中的某些项依赖于其他任务,因此我使用set\u upstream强制执行依赖项 - airflow_home \- dags \- workflow.py workflow.py def get_task_list(): # ... query dynamodb ... def ru
set\u 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\u task\u list()
方法被AWS限制并引发异常
我认为这是因为每当调用run\u task()
时,它都在运行workflow.py
中的所有全局变量,因此我尝试将run\u task()
移动到一个单独的模块中,如下所示:
- airflow_home
\- dags
\- workflow.py
\- mypackage
\- __init__
\- task.py
但这并没有改变任何事情。我甚至尝试过将get\u task\u list()
放入一个用工厂函数包装的子操作符中,其行为方式仍然相同
我的问题是否与这些问题有关
workflow.py
经常运行,为什么任务方法没有引用workflow.py
并且对其没有依赖关系时,get\u task\u list()
引发的错误会导致单个任务失败
最重要的是,并行处理列表和强制执行列表中项目之间的依赖关系的最佳方法是什么?根据您提到的问题,airflow不支持在dag运行时创建任务 因此,气流将在开始运行之前定期生成完整的DAG定义。理想情况下,此类生成的周期应与该DAG的计划间隔相同 但可能是每次气流检查dag的变化时,它也会生成完整的dag,从而导致太多的请求。该时间使用airflow.cfg中的配置min_file_process_interval和dag_dir_list_interval进行控制
关于任务失败,它们失败是因为dag创建本身失败,气流无法启动它们。将
min\u file\u process\u interval
设置为30会将调用get\u task\u list()
的速度减慢到30秒,我停止了节流。至于动态任务创建,我将尝试创建一个dag,它将构建另一个dag,并将其保存到globals()[dag\u id]
,如中所述