是否可以通过代码动态制作DAG文件并将其上传到气流中(AirFlow从dags目录中读取,但是为每个DAG创建文件并将其上传到该文件夹中的速度很慢)?
是否可以创建模板dag并在需要时使用新逻辑填充它?
我看到他们正在使用API。当前版本只有触发器DAG选项。
答案 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创建一个文件。