如何通过单个脚本生成多个气流dag?

时间:2018-03-16 19:18:45

标签: python workflow airflow directed-acyclic-graphs

我想使用一个脚本生成多个气流dags。 dag名称应为“test_parameter”。以下是我的剧本:

from datetime import datetime

# Importing Airflow modules
from airflow.models import DAG
from airflow.operators import DummyOperator

# Specifying the default arguments for the DAG
default_args = {
    'owner': 'Test',
    'start_date': datetime.now()
    }

parameter_list = ["abc", "pqr", "xyz"]

for parameter in parameter_list:
    dag = DAG("test_"+parameter,
              default_args=default_args,
              schedule_interval=None)
    dag.doc_md = "This is a test dag"

    # Creating Start Dummy Operator
    start = DummyOperator(
        task_id="start",
        dag=dag)

    # Creating End Dummy Operator
    end = DummyOperator(
        task_id="end",
        dag=dag)

    # Design workflow of tasks in the dag
    end.set_upstream(start)

所以在这种情况下,它应该创建3个dags:“test_abc”,“test_pqr”和“test_xyz”。

但是在运行脚本时,它只会创建一个dag“test_xyz”。有关如何解决此问题的任何见解。在此先感谢:)

3 个答案:

答案 0 :(得分:2)

我想问题是dag对象开始'并且'结束'被forloop覆盖,因此只保留最后一个值。

虽然您无法动态创建dag,但您可以通过循环动态创建任务,这很奇怪。也许这有帮助。

this.setState((oldState) => {
  return {
    ...oldState,
    emailType: {
      ...oldState.emailType,
      test: event.currentTarget.value
    }
  }
})

答案 1 :(得分:1)

您可以在全局命名空间中注册动态创建的dags。

例如:

global()[parameter] = dag

答案 2 :(得分:1)

是的,可以将每个DAG的配置保存在存储中。例如,您可以将配置保存在持久性存储(DB)中,然后获取配置并将结果保存在缓存中。这样做主要是因为我们希望防止dag脚本每次DAG脚本刷新时都从DB中获取配置。因此,我们使用缓存并保存其过期时间。您可以参考article来了解如何创建动态DAG

for i in range(10):
  dag_id = 'foo_{}'.format(i)
  globals()[dag_id] = DAG(dag_id)

依次,您还希望创建动态子DAG和动态任务。希望对您有所帮助:-)