Kedro 节点分组实战:Pipelines、Tags 与 Namespaces 的选型与部署用法
【免费下载链接】kedroKedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, maintainable, and modular.项目地址: https://gitcode.com/GitHub_Trending/ke/kedro
在生产环境中部署 Kedro 数据管道时,如何有效组织、筛选和执行节点,直接关系到可维护性、调试效率与执行控制。本文聚焦 Kedro 提供的三种节点分组机制——Pipelines(流水线)、Tags(标签)与 Namespaces(命名空间),详细对比它们在 Kedro Viz 可视化、选择性执行、插件集成等方面的能力边界,并结合当前仓库源码解析其底层实现,帮助你在部署场景中做出正确选型并落地使用。
三种分组机制概览
Kedro 的节点(Node)是管道的最小执行单元,而分组机制解决的是"如何把众多节点组织成可独立执行、可单独调试、可清晰可视化的集合"这一问题。当前仓库提供了三种分组手段:
| 分组机制 | 核心思想 | 典型命令 |
|---|---|---|
| Pipelines(流水线) | 以项目预定义的流水线为分组,独立或组合执行 | kedro run --pipelines=<name> |
| Tags(标签) | 给单个节点或整条流水线打标签,按标签灵活挑选节点 | kedro run --tags=<tag> |
| Namespaces(命名空间) | 通过命名空间前缀对节点进行层级分组,保证依赖清晰 | kedro run --namespaces=<ns> |
三种机制各有擅长的场景,也存在明显的限制。下面逐一展开。
按流水线(Pipelines)分组
适用场景与限制
如果项目已经将逻辑拆分为多条流水线(例如数据工程流水线data_engineering与数据科学流水线data_science),就可以把它们作为部署时天然的节点分组:
- 适合使用:项目结构已经支持各流水线在部署环境中独立执行,或按顺序组合执行。
- 不适合使用:你需要在 Kedro Viz 中展开/折叠(expand/collapse)流水线视图。从 Kedro Viz 的流程图视图(flowchart view)来看,流水线视图不支持折叠或展开;如果你需要这种交互能力,应改用命名空间。
在 Kedro Viz 中,你可以切换查看不同流水线的独立视图。如果希望按不同于现有流水线结构的方式重新分组,推荐用标签或命名空间,而不是新建一条流水线。
如何执行
# 运行单条流水线 kedro run --pipelines=<pipeline_name> # 一次运行多条流水线 kedro run --pipelines=<pipeline_name1>,<pipeline_name2>源码实现:--pipelines选项的底层行为
在 CLI 定义 中,--pipelines选项使用split_string回调把逗号分隔的字符串解析为列表,其帮助信息为:
Comma-separated names of registered pipelines to run. Example: --pipelines data_engineering,feature_engineering If not set, the '__default__' pipeline is run.值得注意的两个 CLI 细节(见 run 命令校验逻辑):
--pipeline(单数,-p)与--pipelines(复数)不能同时使用,同时传入会抛出KedroCliError;- 单数形式的
--pipeline已标记为弃用(会发出KedroDeprecationWarning),建议统一使用--pipelines; - 未指定
--pipelines时,默认运行注册表中名为__default__的流水线。
在 Session.run 的实现 中,多流水线通过combined_pipelines += pipelines[name]依次合并为一条组合流水线后统一执行,这也解释了为什么--pipelines支持用逗号一次指定多条。
按标签(Tags)分组
适用场景与限制
标签允许你给单个节点或整条流水线打上标记,从而在不修改流水线结构的前提下灵活执行指定片段。Kedro Viz 会为带标签的节点提供清晰的筛选可视化(Filters Panel),便于理解和定位。
但需要注意标签的两点局限:
- 同一标签的节点可以分布在不同的流水线中,这种跨流水线的重叠会给调试和维护带来额外负担;
- 标签没有层级结构,也不像流水线或命名空间那样强制约束组织方式,跟踪节点分组会变得困难。
何时该用、何时不该用
- 适合使用:
- 需要运行不属于同一条流水线的若干特定节点;
- 想在大型流水线中只重跑一个节点子集(例如只重跑数据校验相关的节点)。
- 不适合使用:
- 被标记节点之间存在强依赖关系,可能会导致执行失败;
- 标签的非层级特性让你难以跟踪节点分组。
如何执行
kedro run --tags=<your_tag_name>--tags(别名-t)在 CLI 定义 中使用split_string回调解析,并且根据帮助文本(TAG_ARG_HELP),该选项可以多次使用,多次使用时只要节点命中任意一个标签就会被选中("nodes having any of those tags")。
源码实现:标签如何挂载与筛选
标签在节点层定义。在 Node 的构造函数 中,tags参数支持str | Iterable[str] | None,最终被归一化为一个集合(self._tags = set(_to_list(tags))),并通过只读属性tags对外暴露。Node.tag(...)方法则返回一个"追加了标签"的节点副本(见 Node.tag 实现),保证原节点不可变。
在流水线层,筛选逻辑位于 Pipeline.only_nodes_with_tags,它返回只包含命中标签节点的新Pipeline对象。Session.run的tags参数(见 session.py#L280-L298)正是把 CLI 传入的标签集合用于这一步过滤:只要节点包含任意一个给定标签,该节点就会被纳入本次运行。
按命名空间(Namespaces)分组
核心特性
命名空间允许你在保持流水线结构一致的前提下,将节点分组以理清依赖与界限。与流水线、标签类似,命名空间也支持选择性执行;但 Kedro 规定一次只能执行一个命名空间(不能同时运行多个)。Kedro Viz 支持对命名空间流水线进行展开/折叠,这正是它区别于流水线分组的关键能力。
两个层级的定义及其注意事项
Pipeline 级命名空间:自动重命名数据对象
当在 Pipeline 级应用命名空间时,Kedro 会自动为该流水线内的所有输入、输出和参数加上namespace_name.前缀,因此你需要同步更新 catalog 中的数据集名称。如果不希望某些输入、输出或参数被加前缀,可以把它们列在Pipeline类的对应参数中,例如:
return Pipeline( base_pipeline, namespace = "new_namespaced_pipeline", # 应用该命名空间后,"new_namespaced_pipeline" 前缀会被加到输入、输出、参数及节点名上 inputs={"the_original_input_name"}, # 输入保持原名,不加命名空间前缀 )除了inputs,Pipeline的outputs与parameters参数同样可以显式豁免对应数据对象的重命名。
Node 级命名空间:不推荐用于分组
在节点级定义命名空间不推荐用于节点分组。节点级命名空间应服务于 Kedro Viz 中创建可折叠视图、对节点做高层级表示;如果用它来分组,行为会与标签相似,无法保证执行一致性(例如命名空间被"打断"时可能产生意外的执行顺序)。
何时该用、何时不该用
- 适合使用:
- 需要在流水线内对节点做逻辑组织,同时保持结构化的执行流程,还希望嵌套命名空间流水线以获得更好的可视化;
- 流水线结构定义清晰,使用命名空间能显著改善 Kedro Viz 中的可视化效果。
- 不适合使用:
- 小型项目、流水线本身很简单时,命名空间会引入不必要的复杂度,此时按流水线分组更合适;
- 命名空间需要额外投入,例如更新 catalog 中的数据集名——因为除非在命名空间流水线参数中显式覆盖,前缀会自动应用到所有元素。
如何执行
kedro run --namespaces=< namespace1,namespace2 >--namespaces(别名-ns)在 CLI 定义 中使用split_node_names回调解析,帮助文本为Run only node namespaces with specified names.。
源码实现:命名空间的底层机制
数据集名校验与点号保留
命名空间机制的关键前提是:点号(.)被 Kedro 保留用于命名空间表示。在 节点数据集名校验函数 中,如果数据集名包含.且不是params:前缀的参数,Kedro 会检查其顶层命名空间是否与节点命名空间匹配,不匹配时发出UserWarning,提示点号记法已保留给自动命名空间使用。
前缀应用规则与豁免
在 Pipeline 构造逻辑 中,namespace与prefix_datasets_with_namespace(默认True)共同决定前缀如何应用:
_prefix_dataset会生成${namespace}.${name};params:参数则生成params:${namespace}.${param_name};- 只有当
prefix_datasets_with_namespace为True时,前缀规则才会被加入数据集重命名映射,这正是inputs/outputs/parameters参数能够"豁免"特定数据对象的实现基础。
命名空间的层级与执行一致性校验
节点命名空间天然支持层级(如a.b.c),Node.namespace_prefixes 会返回从短到长的全部层级前缀(['a', 'a.b', 'a.b.c'])。相应地,Pipeline._validate_namespaces 会在管道构建时校验命名空间的"连续性":如果一个节点的命名空间在依赖路径中被另一个命名空间的节点"打断"(即不属于父子层级关系),会被标记为 interrupted 并记录,从而在构建阶段就暴露出可能破坏执行一致性的结构问题。
按命名空间筛选与分组
- 筛选:
only_nodes_with_namespaces(见 pipeline.py#L669-L700)返回只包含指定命名空间节点的新Pipeline,支持精确匹配和前缀匹配(n.namespace.startswith(f"{node_namespace}.")),未命中任何节点的命名空间会抛出ValueError。 - 分组:
group_nodes_by("namespace")(见 pipeline.py#L567-L628)按顶层命名空间(node.namespace.split(".")[0])把节点聚合成GroupedNodes,每个分组记录其内部节点列表与跨命名空间的依赖关系;未设置命名空间的节点则退化为以自身为组。
命名空间与部署插件的集成
部署 Kedro 管道时,部分插件支持按命名空间分组节点,以生成更高效的任务结构:
Kedro-Airflow:kedro-airflow插件支持在生成 Airflow DAG 时按命名空间分组。使用--group-by namespace标志,可将同一命名空间内的所有节点合并为单个 Airflow task:
kedro airflow create --group-by namespace这样做可以减少 Airflow 任务数量,并让逻辑相关的节点保持在一起。更多细节可参考 Airflow 部署指南。
AWS Step Functions:根据 AWS Step Functions 部署指南,使用Pipeline.group_nodes_by("namespace")让每个流水线级命名空间映射为一个 Lambda 函数和一个 Step Functions task。
AWS Batch:根据 AWS Batch 部署指南,同样使用Pipeline.group_nodes_by("namespace"),让每个流水线级命名空间映射为一个 Batch job。
从 group_nodes_by 的源码 可以看到,该方法支持"namespace"与None/"none"两种策略,其他取值会抛出ValueError——这也是上述部署插件调用group_nodes_by("namespace")时遵循的契约。
总结:三种分组机制速查
| Aspect | Pipelines | Tags | Namespaces |
|---|---|---|---|
| 适用的场景 | 现有流水线结构已经满足需求,或流水线复杂度低、不需要新的分组视图时,无需改用其他机制 | 给单个节点或整条流水线打标签,可在不改变流水线结构的前提下灵活执行指定片段,Kedro Viz 提供清晰的标签节点可视化 | 命名空间对节点分组以理清流水线内的依赖与界限,支持选择性执行,并可在 Kedro Viz 中展开/折叠可视化 |
| 不适用的场景 | 若想按不同于现有流水线结构的方式分组,不必新建流水线,改用标签或命名空间即可 | 缺乏层级结构,用标签会让调试和维护代码库变得更困难 | 节点级命名空间行为类似标签、无法保证执行一致性;流水线级命名空间会重命名输入、输出与参数,若流水线在别处被连接或参数在流水线外被引用,可能引发命名冲突 |
| 语法 | kedro run --pipelines=<your_pipeline_names> | kedro run --tags=<your_tag_name> | kedro run --namespaces=< namespace1,namespace2 > |
| 部署插件支持 | 不适用 | 不适用 | kedro airflow create --group-by namespace;AWS Step Functions(部署指南);AWS Batch(部署指南) |
选型建议
综合三种机制的特点,可以给出如下决策路径:
- 优先复用现有流水线:项目已按流水线拆分且结构合理,直接用
kedro run --pipelines=<name>执行,零额外成本; - 需要临时挑选节点:跨流水线挑选节点、或在大流水线中重跑子集,用标签(
--tags); - 需要层级组织与 Viz 展开/折叠:流水线结构清晰且希望获得更好的可视化与部署任务聚合能力,用命名空间(
--namespaces),并注意同步更新 catalog 中的数据集名。
需要进一步探索的仓库位置:CLI run 命令定义、Pipeline 分组与筛选实现、Node 命名空间与标签属性、Session 运行过滤逻辑。
【免费下载链接】kedroKedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, maintainable, and modular.项目地址: https://gitcode.com/GitHub_Trending/ke/kedro
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考