Airflow 无法计划运行时添加到DAG的任务

Airflow 无法计划运行时添加到DAG的任务,airflow,apache-airflow,airflow-scheduler,Airflow,Apache Airflow,Airflow Scheduler,我的想法是让task foo生成一个输入用户、报告、日志文件等的列表,并为输入列表中的每个元素启动一个任务。目标是利用气流的重试和其他逻辑,而不是重新实现它 因此,理想情况下,我的DAG应该如下所示: 这里唯一的变量是生成的任务数。我想在所有这些都完成之后再做一些任务,所以为每个任务旋转一个新的DAG似乎并不合适 这是我的代码: default_args = { 'owner': 'airflow', 'depends_on_past': False, 'start_d

我的想法是让task foo生成一个输入用户、报告、日志文件等的列表,并为输入列表中的每个元素启动一个任务。目标是利用气流的重试和其他逻辑,而不是重新实现它

因此,理想情况下,我的DAG应该如下所示:

这里唯一的变量是生成的任务数。我想在所有这些都完成之后再做一些任务,所以为每个任务旋转一个新的DAG似乎并不合适

这是我的代码:

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2015, 6, 1)
}

dag = DAG('dynamic_dag_generator', schedule_interval=None, default_args=default_args)

foo_operator = BashOperator(
    task_id='foo',
    bash_command="echo '%s'" % json.dumps(range(0, random.randint(40,60))),
    xcom_push=True,
    dag=dag)

def gen_nodes(**kwargs):
    ti = kwargs['ti']
    workers = json.loads(ti.xcom_pull(task_ids='foo'))

    for wid in workers:
        print("Iterating worker %s" % wid)
        op = PythonOperator(
            task_id='test_op_%s' % wid,
            python_callable=lambda: print("Dynamic task!"),
            dag=dag
        )

        op.set_downstream(bar_operator)
        op.set_upstream(dummy_op)

gen_subdag_node_op = PythonOperator(
    task_id='gen_subdag_nodes',
    python_callable=gen_nodes,
    provide_context=True,
    dag=dag
)

gen_subdag_node_op.set_upstream(foo_operator)

dummy_op = DummyOperator(
    task_id='dummy',
    dag=dag
)

dummy_op.set_upstream(gen_subdag_node_op)

bar_operator = DummyOperator(
    task_id='bar',
    dag=dag)

bar_operator.set_upstream(dummy_op)
在日志中,我可以看到gen_节点被正确执行,即迭代worker 5等。但是,新任务没有计划,没有证据表明它们已经执行

我在网上找到了相关的代码示例,但无法使其正常工作。我错过什么了吗


或者,是否有更合适的方法解决此问题隔离工作单元?

此时,气流不支持在dag运行时添加/删除任务

工作流顺序将是dag运行开始时计算的任何顺序

这意味着您不能根据运行中发生的情况添加/删除任务。可以基于与运行无关的内容在for循环中添加X个任务,但在运行开始后,不会更改工作流形状/顺序

很多时候,您可以使用BranchPythonOperator在dag运行期间做出决策,这些决策可以基于您的xcom值,但它们必须是下一个已经存在于工作流中的分支的决策


Dag运行和Dag定义在气流中以不完全直观的方式分开,但在Dag运行xcom、Dag_run.conf等内部创建/生成的任何内容都不能用于定义Dag本身

谢谢你的回答,@jhnclvr。因此,从本质上讲,如果您想迭代N个项目,那么从xcom中提取列表并在一个任务中进行迭代是唯一的方法?这是一种肯定有效的方法。您还可以有X个不同的分支,如果能够适合您的场景,那么您可以根据xcom值进行下去。或者,类似地,您可以使用基于xcom的TriggerDagRunOperator触发其他DAG。我的任务是解压缩文件,1:可能需要几分钟,2:需要运行任意次数。所以,如果我要创建一个任务,在要展开的xcom文件列表上迭代,它不能有一个超时,对吗?