我正在尝试创建动态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,并将其添加到调度程序中。
答案 0 :(得分:1)
我想通过以下操作可以解决
testDynDags
dag和tst_dyn_dags
任务(实例化和调用)fetch_new_dags(..)
方法说明
很明显,将dag生成代码包装在Airflow任务本身中是没有意义的。
UPDATE-1
根据注释中的指示,我推断该要求要求您修改外部源,以将输入(创建多少个dag或任务)馈送到DAG /任务生成脚本。尽管这确实是一个复杂的用例,但是实现此目的的一种简单方法是创建两个单独的DAG。