在运行时添加到DAG的任务无法安排

时间:2017-06-19 09:31:19

标签: airflow apache-airflow airflow-scheduler

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

所以,理想情况下,我的DAG应该是这样的: enter image description here

此处唯一的变量是生成的任务数。在完成所有这些任务后,我想完成更多任务,因此为每项任务启动新的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_nodes已正确执行(即Iterating worker 5等)。但是,新任务没有安排,也没有证据表明它们已被执行。

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

或者,是否有更合适的方法解决这个问题(隔离工作单位)?

1 个答案:

答案 0 :(得分:3)

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

工作流程顺序将是在dag运行开始时评估的任何内容。

See the second paragraph here.

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

很多时候,您可以使用BranchPythonOperator在dag运行期间做出决定(并且这些决策可以基于您的xcom值)但是他们必须决定已存在于工作流程中的分支。

Dag运行,Dag定义在气流中以不完全直观的方式分离,但或多或​​少在dag run(xcomdag_run.conf内创建/生成的任何内容等等)不能用于定义dag本身。