如何在UI的气流中对DAG进行参数化?

时间:2018-04-04 21:35:08

标签: airflow airflow-scheduler

背景信息:我已经定义了一个气流DAG,它根据名为compute_metrics的参数对某个实体的某些数据执行操作org。调用myapi.compute_metrics(org)之类的内容。这个流程主要是临时运行的。

问题:当我从气流UI手动触发DAG时,我希望能够选择org来运行流程。

我能想到的最直接的解决方案是生成n个不同的DAG,每个组织一个。 DAG会id像:compute_metrics_1compute_metrics_2等...然后当我需要触发单个org的计算指标时,我可以选择该组织的DAG。这不会随着我添加orgs而扩展,因为我添加了更多类型的计算。

我做了一些研究,似乎我可以为气流创建一个烧瓶蓝图,据我所知,这扩展了UI。在这个扩展的用户界面中,我可以添加输入组件(如文本框)来挑选组织,然后将其作为conf传递给由蓝图手动创建的DagRun。那是对的吗?我正在成像我可以写一些像:

session = settings.Session()

execution_date = datetime.now()
run_id = 'external_trigger_' + execution_date.isoformat()

trigger = DagRun(
    dag_id='general_compute_metrics_needs_org_id',
    run_id=run_id,
    state=State.RUNNING,
    execution_date=execution_date,
    external_trigger=True,
    conf=org_ui_component.text) # pass the org id from a component in the blueprint
session.add(trigger)
session.commit() # I don't know if this would actually be scheduled by the scheduler

我的想法听起来不错?有没有更好的方法来实现我想要的?

1 个答案:

答案 0 :(得分:3)

  

我做了一些研究,似乎我可以为气流创建一个瓶子蓝图,据我所知,这扩展了UI。

蓝图扩展了API。如果您想要一些用户界面,则需要提供模板视图。实现这一目标的最完整功能的方法是开发自己的Airflow Plugin

如果您想手动创建DagRun,可以使用this trigger作为参考。为简单起见,我使用API触发Dag。

特别是关于您的问题,我会有一个DAG compute_metrics从气流Variable读取org。它们是全局的,可以动态设置。您可以在变量名称前加上类似DagRun id的内容,以使其唯一,从而使dag-concurrent安全。