欢迎您,未来的数据流架构师!请将 dora
想象成一个高度智能的自动化工厂,而您,就是这家工厂的总设计师。您的核心任务是设计一条或多条高效的流水线 (Dataflow),用于处理、转换和传输数据。
在这条流水线上,每一个独立的工作站,我们称之为 节点 (Node)。
简单来说,一个节点就是一个独立的工人。它具备以下特征:
id
) 和供人阅读的职位描述。path
或 operator
),即它要执行的程序逻辑。inputs
),并在完成自己的工作后,将新产品放到传送带上,交给下游工位 (outputs
)。您的全部设计工作,都将体现在一份名为 dataflow.yml
的工厂总蓝图中。这份文档将是您学习如何绘制这份蓝图的终极指南。
根据蓝图的设计,工人主要有两种工作模式:
现在,让我们深入每一个细节,解构节点的全部属性。
我们将节点的所有属性划分为几个逻辑部分,并对每个属性进行“通俗讲解”和“参数详解”两个层面的分析。
这些属性定义了工人的基本信息。
id
NodeId
(String)/
) 字符。inputs
字段引用,用于建立数据流连接。name
& description
name
),并写一份详细的“职位描述” (description
)。这不会改变工人的技能,但能让工厂蓝图更容易被人类读懂。
Option<String>
name
是简短的可读名称,description
是详细的功能说明。主要用于增强文档、日志和监控的可读性。这些属性决定了工人如何工作,以及他具体执行什么任务。
path
path
,它就是一个独立工作的工人。
Option<String>
operators
和 operator
字段互斥。args
, env
, build
。若与 git
配合,此路径通常相对于 Git 仓库的根目录。args
Option<String>
path
指定的可执行文件的命令行参数字符串。path
的独立进程节点有效。env
Option<BTreeMap<String, EnvValue>>
EnvValue
支持字符串、布尔值和数字。是传递敏感信息(如密钥)的最佳方式。operators
& operator
path
,但有 operators
或 operator
,那它就不是一个干活的工人,而是一个“工位管理员”(运行时节点)。他负责管理一整个操作符 (Operator) 团队在同一个大工位里高效协作。operator
是 operators
只有一个成员时的简化写法。
Option<RuntimeNode>
/ Option<SingleOperatorDefinition>
path
字段互斥;operators
和 operator
自身也互斥。这些属性定义了传送带,让零件在工人之间流动。
outputs
BTreeSet<DataId>
(Set of Strings)[]
。下游节点的 inputs
必须引用此列表中声明的 ID。inputs
BTreeMap<DataId, Input>
(Map)local_input_id: upstream_node_id/upstream_output_id
。send_stdout_as
Option<String>
stdout
) 和标准错误 (stderr
) 流重定向到一个具名的数据流输出通道。outputs
列表中声明。outputs
。这些属性让你的工厂实现了“云采购”和“岗前自动化培训”。
git
, branch
, tag
, rev
path
) 手动放到每个工位,不如让工人直接从中央“技能图书馆” (git
) 下载。你可以指定下载最新的“草稿” (branch
),某个“发行版” (tag
),或者精确到某一页的“修订版” (rev
)。
Option<String>
git
指定仓库 URL;branch
, tag
, rev
用于版本控制,分别对应分支、标签和提交哈希。branch
, tag
, rev
互斥,且必须与 git
配合使用。build
build
就是这个组装指令。
Option<String>
dora build
阶段执行的构建命令。env
中定义的环境变量对此命令生效。在 dora
的核心库中详细定义了 Node
节点的参数。
文件 libraries/message/src/descriptor.rs
第 115行
id: NodeId
id
必须唯一,且不能包含 /
字符。inputs
字段用它来路由数据。name: Option<String>
description: Option<String>
path: Option<String>
dora
会运行这个文件。如果一个 Node
定义了 path
,它就是一个独立进程节点。args: Option<String>
path
指定的可执行文件的命令行参数。env: Option<BTreeMap<String, EnvValue>>
operators: Option<RuntimeNode>
Node
定义了 operators
字段(而没有 path
字段),它就成为一个运行时节点。operator: Option<SingleOperatorDefinition>
operators
字段的便利版。当一个运行时节点只包含一个操作符时,可以使用此字段来简化 YAML 配置。它和 operators
是互斥的。outputs: BTreeSet<DataId>
inputs: BTreeMap<DataId, Input>
input_id
),value (Input
) 则指明了该输入来源于哪个上游节点 (source_node_id
) 的哪个输出 (source_node_output_id
)。这是构建数据流图(DAG)连接关系的核心。send_stdout_as: Option<String>
dora
的数据输出流中。这使得日志和调试信息可以像普通数据一样在数据流中传递。build: Option<String>
dora build
期间需要执行的构建命令。例如 cargo build
或 pip install
。这使得 dora
可以直接从源代码构建节点。git: Option<String>
dora build
会自动克隆这个仓库,使得数据流可以轻松分发和复现。branch: Option<String>
, tag: Option<String>
, rev: Option<String>
git
字段配合使用,用于检出(checkout)指定的 Git 分支、标签或提交版本。这确保了构建的一致性。custom: Option<CustomNode>
path
, args
等字段。deploy: Option<Deploy>
#[schemars(skip)]
属性看,它不包含在公开的配置 schema 中,属于内部或实验性功能。这份最新的 Node
定义展示了一个成熟且高度灵活的设计方案:
Node
结构体是这个声明的核心,它是一个纯粹的数据容器,可以被 serde
完美地解析。path
与 operators
/operator
字段的存在与否,dora
能够智能地推断出节点是应作为独立进程运行,还是作为轻量级操作符的宿主运行。这种设计使得 YAML 语法非常直观和扁平。git
和 build
字段,dora
将节点的源码管理和构建过程无缝集成到其工作流中,极大地提升了项目的可移植性和可复现性。id
, name
, description
path
或 operators
inputs
, outputs
build
, git
现在你已经是 dora 节点配置专家了!一个全功能的节点定义可能看起来像下面这样,但别怕,你已经理解了每一部分!
name
和 description
,让你的数据流蓝图自己会说话。git
+ tag
或 rev
的组合,杜绝不确定性。env
和 args
传入配置,保持代码的通用性。send_stdout_as
,它会在未来为你节省大量调试时间。现在,您已经拥有了设计 dora
节点所需的所有知识,从高层概念到技术细节。是时候打开您的 dataflow.yml
,开始构建属于您自己的、高效、智能的自动化数据工厂了!