如何让Kedro按指定顺序执行无依赖的平级分支节点
解决方案
Kedro默认根据节点的输入输出依赖关系做拓扑排序,无业务依赖的节点执行顺序是随机的,要固定31→32→33的执行顺序,可通过以下两种方式实现:
方法1:使用节点内置的before/after参数(推荐,无额外配置)
直接在定义节点时通过官方内置的before、after参数指定执行顺序,不需要修改数据集配置,也不会影响原有业务逻辑:
from kedro.pipeline import node, pipeline # 定义三个分支节点时指定顺序 node_31 = node( func=your_func_31, inputs="output_of_node3", outputs="output_of_node31", name="node31" ) node_32 = node( func=your_func_32, inputs="output_of_node3", outputs="output_of_node32", name="node32", after="node31" # 指定必须在node31执行完成后再运行 ) node_33 = node( func=your_func_33, inputs="output_of_node3", outputs="output_of_node33", name="node33", after="node32" # 指定必须在node32执行完成后再运行 ) # 组装pipeline即可 your_pipeline = pipeline([node_31, node_32, node_33])
如果需要同时指定多个前置节点,after参数也支持传入列表,比如after=["node31", "other_node"]。
方法2:使用虚拟数据集建立依赖关系
如果需要跨pipeline控制执行顺序,或者适配旧版本Kedro,可通过创建无实际存储的虚拟内存数据集建立人工依赖:
- 首先在
conf/base/catalog.yml中定义虚拟数据集:
# 虚拟数据集,仅用于标记执行顺序,不会实际写入存储 after_node31: type: kedro.io.MemoryDataSet after_node32: type: kedro.io.MemoryDataSet
- 修改节点的输入输出,绑定依赖关系:
node_31 = node( func=your_func_31, inputs="output_of_node3", outputs=["output_of_node31", "after_node31"], # 输出虚拟数据集作为执行完成标记 name="node31" ) node_32 = node( func=your_func_32, inputs=["output_of_node3", "after_node31"], # 依赖node31的完成标记 outputs=["output_of_node32", "after_node32"], name="node32" ) node_33 = node( func=your_func_33, inputs=["output_of_node3", "after_node32"], # 依赖node32的完成标记 outputs="output_of_node33", name="node33" )
注意:两种方案添加的都是仅用于控制执行顺序的人工依赖,建议在代码中添加注释说明用途,避免后续维护混淆。
内容的提问来源于stack exchange,提问作者William Huang
相关产品推荐
相关产品推荐

