Airflow 我可以从每分钟运行一次的调度程序作业DAG创建临时参数化DAG吗

Airflow 我可以从每分钟运行一次的调度程序作业DAG创建临时参数化DAG吗,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我正在研究气流,看看它是否适合我的用例,从文档中不清楚它是否适合这个场景。我想根据一些非常动态的标准为每个客户安排一个工作流程,这不属于每X分钟运行一次的标准“CRON”循环(因为一起运行会产生一些影响) 客户数据库 Customer_id, "CRON" desired interval (best case) 1 , 30 minutes 2 , 2 hours ... ... <<<<<<< thousands of these potential

我正在研究气流,看看它是否适合我的用例,从文档中不清楚它是否适合这个场景。我想根据一些非常动态的标准为每个客户安排一个工作流程,这不属于每X分钟运行一次的标准“CRON”循环(因为一起运行会产生一些影响)

客户数据库

Customer_id, "CRON" desired interval (best case)
1 , 30 minutes
2 , 2 hours
...
... <<<<<<< thousands of these potential jobs
从我读到的材料来看,DAG似乎有一个指定的时间表,并且在结构上是静态的。DAG似乎在所有输入上运行,而不是在每个输入上生成。
如果给定的DAG尚未完成但计划时间已到,则也不清楚计划是如何工作的。对于相同的输入,可能会有相同管道的多个运行(错误)。由于我有管道,其完成时间取决于客户、系统动态负载等。我想自己管理调度方面,并生成“DAG”

这可以通过每分钟调度一次的“控制器”DAG实现,然后在满足所需条件时触发“目标”DAG的运行。气流有一个很好的例子,请参见和。控制器使用
TriggerDagRunOperator()
,这是一个为任何所需DAG启动运行的操作符

trigger = TriggerDagRunOperator(
    task_id="test_trigger_dagrun",
    trigger_dag_id="example_trigger_target_dag",  # Ensure this equals the dag_id of the DAG to trigger
    conf={"message": "Hello World"},
    dag=dag,
)
那么目标DAG不需要做任何特殊的事情,除了应该有
schedule\u interval=None
。请注意,在触发时,您可以填充目标稍后可以使用的
conf
字典,以防您想要自定义每个触发的运行

bash_task = BashOperator(
    task_id="bash_task",
    bash_command='echo "Here is the message: \'{{ dag_run.conf["message"] if dag_run else "" }}\'"',
    dag=dag,
)
回到您的案例,您的场景是类似的,但与示例不同的是,您不会每次启动一个DAG,并且您有多个可以启动的目标DAG。这就是发挥作用的地方,它基本上是一个运行您指定的python方法的任务,只需要返回true或false。如果返回true,则它会像往常一样继续执行下一个下游任务,否则它会“短路”并跳过下游任务。如果你想看到这一点,值得一试。通过使用for循环动态创建任务,我认为您将在控制器DAG中获得如下内容:

dag = DAG(
    dag_id='controller_customer_pipeline',
    default_args=args,
    schedule_interval='* * * * *',
)

def shouldRunDagForCustomer(customer, ...):
   currentStateOfJobs = ....
   situationalAwarenessOfWorld = .... // check all sort of interesting metrics
   if some criteria is met for this customer: return true // run the dag for this customer
   else : return false

for customer in DB:
   check_run_conditions = ShortCircuitOperator(
      task_id='check_run_conditions_' + customer,
      python_callable=shouldRunDagForCustomer,
      op_args=[customer],
      op_kwargs={...}, # extra params if needed
      dag=dag,
   )

   trigger_run = TriggerDagRunOperator(
      task_id='trigger_run_' + customer,
      trigger_dag_id='target_customer_pipeline_' + customer,  # standardize on DAG ids for per customer DAGs
      conf={"foo": "bar"},  # pass on extra info to triggered DAG if needed
      dag=dag,
   )

   check_run_conditions >> trigger_run
那么,您的目标DAG就是每个客户的工作

这可能不是实现类似功能的唯一方法,但基本上是的,我认为在气流中实现是可行的

dag = DAG(
    dag_id='controller_customer_pipeline',
    default_args=args,
    schedule_interval='* * * * *',
)

def shouldRunDagForCustomer(customer, ...):
   currentStateOfJobs = ....
   situationalAwarenessOfWorld = .... // check all sort of interesting metrics
   if some criteria is met for this customer: return true // run the dag for this customer
   else : return false

for customer in DB:
   check_run_conditions = ShortCircuitOperator(
      task_id='check_run_conditions_' + customer,
      python_callable=shouldRunDagForCustomer,
      op_args=[customer],
      op_kwargs={...}, # extra params if needed
      dag=dag,
   )

   trigger_run = TriggerDagRunOperator(
      task_id='trigger_run_' + customer,
      trigger_dag_id='target_customer_pipeline_' + customer,  # standardize on DAG ids for per customer DAGs
      conf={"foo": "bar"},  # pass on extra info to triggered DAG if needed
      dag=dag,
   )

   check_run_conditions >> trigger_run