动态构建集合以在Airflow dag中循环

时间:2018-03-06 20:57:44

标签: python airflow

我最近一直在与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是否有更好的模式?

1 个答案:

答案 0 :(得分:1)

在您的代码示例中,我们没有看到DAG的调度间隔,但是我假设您已调度它,例如No such algorithm: TLS for provider SunPKCS11-myprovider,并且您希望数据库查询每天运行一次。

在“气流”中,调度程序会定期解析DAG(因此“每30秒”)。因此,您的python代码会引起问题。

在您的情况下,我将考虑改变观点:为什么不尝试在PosgresOperator link中运行数据库查询,然后将其作为DAG的一部分呢?根据该运算符的输出(例如,您可以通过XCOM传播或通过对象存储中的文件进行传播),您可以在下游创建一个PythonOperator,它不为一个客户端运行功能,而是为所有客户端运行功能。