在气流中创建DAG的可能性

时间:2020-02-25 14:28:58

标签: airflow airflow-scheduler airflow-operator

是否可以通过代码动态制作DAG文件并将其上传到气流中(AirFlow从dags目录中读取,但是为每个DAG创建文件并将其上传到该文件夹​​中的速度很慢)?

是否可以创建模板dag并在需要时使用新逻辑填充它?

我看到他们正在使用API​​。当前版本只有触发器DAG选项。

2 个答案:

答案 0 :(得分:1)

您可以在一个文件中轻松创建多个dag:

create_dag(dag_id):
  dag = DAG(....)
  // some tasks added
  return dag

for dag_id in dags_lists:
  globals()[dag_id] = create_dag(dag_id)

如果使用模板函数(在上例中为create_dag)创建适当的DAG对象,并将其在globals对象中可用,则Airflow会将其识别为单独的DAG。

答案 1 :(得分:1)

是的,您可以按以下方式创建动态DAG:

from datetime import datetime

from airflow import DAG

from airflow.operators.python_operator import PythonOperator


def create_dag(dag_id,
               schedule,
               dag_number,
               default_args):

    def hello_world_py(*args):
        print('Hello World')
        print('This is DAG: {}'.format(str(dag_number)))

    dag = DAG(dag_id,
              schedule_interval=schedule,
              default_args=default_args)

    with dag:
        t1 = PythonOperator(
            task_id='hello_world',
            python_callable=hello_world_py,
            dag_number=dag_number)

    return dag


# build a dag for each number in range(10)
for n in range(1, 10):
    dag_id = 'hello_world_{}'.format(str(n))

    default_args = {'owner': 'airflow',
                    'start_date': datetime(2018, 1, 1)
                    }

    schedule = '@daily'

    dag_number = n

    globals()[dag_id] = create_dag(dag_id,
                                  schedule,
                                  dag_number,
                                  default_args)

来自https://www.astronomer.io/guides/dynamically-generating-dags/

的示例

但是,请注意,这可能会导致一些问题,例如任务执行之间的延迟。这是因为当计划/执行单个DAG的每个任务时,Airflow Scheduler和Worker将不得不解析整个文件。

由于同一文件中将包含许多DAG(比如100个),这意味着在为DAG1执行单个任务时必须解析所有100个DAG对象。

我建议构建一个工具,该工具可为每个DAG创建一个文件。