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