我最近一直在与Airflow合作,找到一个非常常见的模式是循环一些集合以创建多个任务。非常类似于github中示例dags文件夹中的example_python_operator.py dag。
我的问题与动态构建循环迭代的集合有关。假设您要为存储在数据库中的每组未知客户端创建任务,并计划将其作为填充列表的方法进行查询。像这样:
first_task = PythonOperator(
task_id='some_upstream_task',
provide_context=True,
python_callable=some_upstream_task,
dag=dag)
clients = my_database_query()
for client in clients:
task = PythonOperator(
task_id='client_' + str(client),
python_callable=some_function,
dag=dag)
task.set_upstream(first_task)
从我所看到的情况来看,这意味着即使您的dag每周运行一次,您的数据库也会每30秒为这些客户端进行一次轮询。即使您从迭代器设置了一个上游运算符并通过xcoms返回客户端,并且每隔30秒用my_database_query()
替换xcom_pull()
您的静态轮询xcoms。这对我来说似乎很浪费,所以我想知道这种类型的dag是否有更好的模式?
答案 0 :(得分:1)
在您的代码示例中,我们没有看到DAG的调度间隔,但是我假设您已调度它,例如No such algorithm: TLS for provider SunPKCS11-myprovider
,并且您希望数据库查询每天运行一次。
在“气流”中,调度程序会定期解析DAG(因此“每30秒”)。因此,您的python代码会引起问题。
在您的情况下,我将考虑改变观点:为什么不尝试在PosgresOperator link中运行数据库查询,然后将其作为DAG的一部分呢?根据该运算符的输出(例如,您可以通过XCOM传播或通过对象存储中的文件进行传播),您可以在下游创建一个PythonOperator,它不为一个客户端运行功能,而是为所有客户端运行功能。