我们如何使用TriggerDagRunOperator触发多次气流眩晕?

时间:2017-06-28 15:34:21

标签: directed-acyclic-graphs airflow

我有一个场景,其中完成后的特定dag需要触发多个dag,使用TriggerDagRunOperator触发单个dag,是否可以将多个dag传递给TriggerDagRunOperator以触发多个dag?

只有在成功完成当前dag后才能触发。

3 个答案:

答案 0 :(得分:6)

我也遇到了同样的问题。并且没有开箱即用的解决方案,但是我们可以为此编写一个自定义运算符。

因此,这里是一个自定义运算符的代码,它们以python_callabletrigger_dag_id作为参数:

class TriggerMultiDagRunOperator(TriggerDagRunOperator):

    @apply_defaults
    def __init__(self, op_args=None, op_kwargs=None, *args, **kwargs):
        super(TriggerMultiDagRunOperator, self).__init__(*args, **kwargs)
        self.op_args = op_args or []
        self.op_kwargs = op_kwargs or {}

    def execute(self, context):
        session = settings.Session()
        created = False
        for dro in self.python_callable(context, *self.op_args, **self.op_kwargs):
            if not dro or not isinstance(dro, DagRunOrder):
                break

            if dro.run_id is None:
                dro.run_id = 'trig__' + datetime.utcnow().isoformat()

            dbag = DagBag(settings.DAGS_FOLDER)
            trigger_dag = dbag.get_dag(self.trigger_dag_id)
            dr = trigger_dag.create_dagrun(
                run_id=dro.run_id,
                state=State.RUNNING,
                conf=dro.payload,
                external_trigger=True
            )
            created = True
            self.log.info("Creating DagRun %s", dr)

        if created is True:
            session.commit()
        else:
            self.log.info("No DagRun created")
        session.close()

trigger_dag_id是我们要多次运行的目标。

python_callable是一个函数,它应该返回DagRunOrder对象的列表,一个对象用于调度带有dag_id trigger_dag_id的DAG的一个实例。

GitHub上的代码和示例:https://github.com/mastak/airflow_multi_dagrun 关于此代码的更多描述:https://medium.com/@igorlubimov/dynamic-scheduling-in-airflow-52979b3e6b13

答案 1 :(得分:0)

作为API docs状态,该方法接受单个dag_id。但是,如果您希望在完成后无条件启动下游DAG,为什么不将这些任务放在单个DAG中并在那里设置依赖项/工作流?然后,您可以在适当的位置设置depends_on_past=True

编辑:如果您在单独的DAG中绝对需要它们,那么简单的解决方法是创建多个TriggerDagRunOperators并将它们的依赖项设置为相同的任务。

答案 2 :(得分:0)

你可以尝试循环它!例如:

for i in list:

trigger_dag =TriggerDagRunOperator(task_id='trigger_'+ i, 
                                trigger_dag_id=i,
                                python_callable=conditionally_trigger_non_indr,
                                dag=dag)

根据所需的任务设置此项。我为PythonOperator自动化了这样的东西。如果这适合你,你可以试试!