背景信息:我已经定义了一个气流DAG,它根据名为compute_metrics
的参数对某个实体的某些数据执行操作org
。调用myapi.compute_metrics(org)
之类的内容。这个流程主要是临时运行的。
问题:当我从气流UI手动触发DAG时,我希望能够选择org
来运行流程。
我能想到的最直接的解决方案是生成n
个不同的DAG,每个组织一个。 DAG会id
像:compute_metrics_1
,compute_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
我的想法听起来不错?有没有更好的方法来实现我想要的?
答案 0 :(得分:3)
我做了一些研究,似乎我可以为气流创建一个瓶子蓝图,据我所知,这扩展了UI。
蓝图扩展了API。如果您想要一些用户界面,则需要提供模板视图。实现这一目标的最完整功能的方法是开发自己的Airflow Plugin。
如果您想手动创建DagRun
,可以使用this trigger作为参考。为简单起见,我使用API触发Dag。
特别是关于您的问题,我会有一个DAG compute_metrics
从气流Variable读取org
。它们是全局的,可以动态设置。您可以在变量名称前加上类似DagRun id的内容,以使其唯一,从而使dag-concurrent安全。