调度程序未添加动态dag

时间:2019-08-12 13:58:52

标签: airflow airflow-scheduler

我正在尝试创建动态DAG,然后将它们发送到调度程序。我尝试了来自https://www.astronomer.io/guides/dynamically-generating-dags/的引用,效果很好。我将其更改为以下代码。在调试问题时需要帮助。

我尝试过 1.测试运行文件。 Dag被执行,并且globals()正在打印所有DAG对象。但不知何故不在list_dags或用户界面中列出

from datetime import datetime, timedelta
import requests
import json
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from airflow.operators.http_operator import SimpleHttpOperator

def create_dag(dag_id,
               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="@hourly",
              default_args=default_args)

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

    return dag


def fetch_new_dags(**kwargs):

    for n in range(1, 10):
        print("=====================START=========\n")
        dag_id = "abcd_" + str(n) 
        print (dag_id)
        print("\n")
        globals()[dag_id] = create_dag(dag_id, n, default_args)
        print(globals())

default_args = {
    'owner': 'diablo_admin',
    'depends_on_past': False,
    'start_date': datetime(2019, 8, 8),
    'email': ['airflow@example.com'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 1,
    'retry_delay': timedelta(minutes=1),
    'trigger_rule': 'none_skipped'
    #'schedule_interval': '0 * * * *'
    # 'queue': 'bash_queue',
    # 'pool': 'backfill',
    # 'priority_weight': 10,
    # 'end_date': datetime(2016, 1, 1),
}

dag = DAG('testDynDags', default_args=default_args, schedule_interval='*/1 * * * *')
#schedule_interval='*/1 * * * *'

check_for_dags = PythonOperator(dag=dag,
                   task_id='tst_dyn_dag',
                   provide_context=True,
                   python_callable=fetch_new_dags
                   )




check_for_dags

计划动态创建10个DAG,并将其添加到调度程序中。

1 个答案:

答案 0 :(得分:1)

我想通过以下操作可以解决

  • 完全删除全局testDynDags dag和tst_dyn_dags任务(实例化和调用)
  • 在全局范围内使用必需的参数调用您的fetch_new_dags(..)方法

说明

  • 动态dag /任务仅表示您在编写dag-definition文件时具有明确定义的逻辑,可以帮助以预定方式创建具有已知结构的任务/ dag 。
  • 您无法在运行时确定DAG的结构(任务执行)。因此,例如,如果上游任务返回整数值n,则无法将n个相同的任务添加到DAG。但是您可以遍历包含n个段的YAML文件并生成n个任务/中断。

很明显,将dag生成代码包装在Airflow任务本身中是没有意义的。


UPDATE-1

根据注释中的指示,我推断该要求要求您修改外部源,以将输入(创建多少个dag或任务)馈送到DAG /任务生成脚本。尽管这确实是一个复杂的用例,但是实现此目的的一种简单方法是创建两个单独的DAG。

  • 一个dag偶尔运行一次,并生成存储在外部资源(如Airflow Variable)(或其他任何外部存储,如文件/ S3 /数据库等)中的输入
  • 通过读取第一个DAG写入的相同数据源,以编程方式构造第二个DAG

您可以从Adding DAGs based on Variable value section

中汲取灵感