十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache DolphinScheduler Switch 条件分支节点:配置、原理与实战示例

Apache DolphinScheduler Switch 条件分支节点:配置、原理与实战示例 Apache DolphinScheduler Switch 条件分支节点配置、原理与实战示例【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler本指南完整讲解 Apache DolphinScheduler 中的 Switch条件分支任务节点如何基于全局变量与用户编写表达式的结果在工作流 DAG 中实现满足条件走指定分支、全部不满足走默认分支的条件路由。读完本文你将掌握 Switch 节点的创建流程、Condition 与 Branch flow 两个核心参数、表达式求值语法以及它与全局参数、上下游参数传递的协作方式并理解其在 Master 端基于 Nashorn 沙箱的底层求值原理。Overview什么是 Switch 节点Switch 是 DolphinScheduler 中一个条件判断节点它根据用户配置的表达式求值结果来决定工作流 DAG 接下来执行哪条分支。其判断依据来自两部分全局变量在工作流定义页配置IN方向参数对整个工作流的所有任务节点生效用户在节点中编写的表达式表达式运行结果作为分支选择依据。NoteSwitch 条件表达式使用javax.script.ScriptEngine.eval语义执行在当前版本的实际实现中由 Master 端的 Nashorn 沙箱完成求值详见下文底层原理一节。从源码结构看Switch 节点属于逻辑任务Logic Task而非执行型任务它本身不提交任何 shell/SQL 到 Worker 执行而是纯粹在 Master 端完成分支路由决策后立即成功结束。这一点在 SwitchLogicTask.java 的start()方法中体现得很清楚——计算出nextBranch后直接调用onTaskSuccess()。创建 Switch 任务进入项目管理 - 项目名称 - 工作流定义点击创建工作流按钮进入 DAG 编辑页面从左侧工具栏将 Switch 节点拖拽到画布上创建任务。Note创建 Switch 任务后必须先配置上下游关系再配置任务分支参数。因为 Switch 的分支指向的是下游任务节点只有先把下游任务通过连线挂到 Switch 节点上分支下拉选项中才能选择到这些下游任务。任务参数除 DolphinScheduler Task Parameters Appendix 中Default Task Parameters一节的通用默认参数节点名称、运行标志、描述、任务优先级、Worker 分组、失败重试次数、失败重试间隔、超时告警、延迟执行时间、资源、上游任务等外Switch 节点特有的参数如下参数说明Condition可以为 Switch 任务配置多个条件。当条件满足时执行所配置的分支可配置多个不同的条件以适配不同的业务场景。条件按配置顺序依次求值命中第一个为 true 的条件即结束。Branch flow默认分支流。当所有条件都不满足时执行该分支流。参数在底层的数据结构可以从 SwitchParameters.java 中看到SwitchResult包含dependTaskList条件列表每个元素是condition nextNode的组合对应 SwitchResultVo.java和nextNode默认分支节点 code。其checkParameters()校验逻辑要求条件列表与默认分支至少存在其一且每个条件都必须绑定nextNode否则参数校验不通过。一个真实的序列化示例可以在集成测试资源 workflow_with_one_success_switch_two_fake_task.yaml 中看到其taskParams为{ localParams: [], rawScript: , resourceList: [], switchResult: { dependTaskList: [ { condition: true true, nextNode: 2 } ], nextNode: 3 } }即条件true true命中时走 code 为 2 的分支否则走 code 为 3 的默认分支。任务示例下面用一个 Switch 任务加三个 Shell 任务演示完整的分支流转过程。创建工作流新建一个 Switch 任务以及三个 Shell 任务作为其下游分支Shell 任务并非必需这里只是演示载体。Switch 任务必须与下游任务建立连线关系、配置好依赖之后下游任务才会出现在分支的选择列表中。设置条件配置条件与默认分支满足条件则走指定分支条件均不满足则走默认分支。在下图示例中变量值为A时执行分支任务taskA变量值为B时执行分支任务taskB两者都不满足时执行default默认分支。由于 Switch 任务类型不支持配置自定义参数因此无需定义IN型局部变量 X可以直接使用上游节点输出的OUT型输出 X。关于参数传递方向的更多细节请参考 Parameter Context参数上下文。需要特别说明的是3.3.x 之后版本调整了局部变量获取逻辑下游节点需要配置IN型局部变量 X 才能引用上游OUT型输出 X而 Switch 节点属于特例文档中明确指出其类型不支持配置自定义参数因此直接使用上游 OUT 输出即可。条件中可以使用全局变量全局参数的具体定义方式请参考 Global Parameter。下图配置的全局变量值为A如果执行正确taskA将被正确执行。执行与验证运行工作流观察是否按预期执行。可以看到指定的下游任务taskA如期被执行。条件表达式求值原理参数替换${param}与类型感知Switch 条件表达式本质上是一段 JavaScript 布尔表达式其中可以通过${paramName}引用全局参数或上游传递的变量。Master 端在求值前会先做参数替换逻辑位于 SwitchTaskUtils.java 的generateContentWithTaskParams方法先去除条件中的单引号统一替换为双引号避免与 JS 字符串语法冲突用正则[\]*\$\{(.*?)\}[\]*匹配所有${...}占位符按参数类型决定替换后的字面量形态数字INTEGER/LONG/FLOAT/DOUBLE 等与布尔类型直接替换为字面值字符串类型替换为带双引号的值。对应地SwitchTaskUtilsTest.java 中的测试验证了全局参数testINTEGER类型值为 1配合条件${test}1替换后得到11并可正常求值。这解释了为什么写${var}A或${var}1都能被正确解析。沙箱求值NashornSandbox 与安全防护求值动作由SwitchTaskUtils.evaluate(String expression)完成SwitchTaskUtils.java使用delight.nashornsandbox.NashornSandbox执行表达式并取Boolean.TRUE结果。Nashorn 是 Java 平台自带的 JavaScript 引擎因此官方文档标注的使用javax.script.ScriptEngine.eval执行表达式指的就是这套 JS 求值语义。沙箱化执行有两个值得注意的细节Array.prototype.includes 兼容沙箱静态初始化时预先注入了一段 polyfillNASHORN_POLYFILL_ARRAY_PROTOTYPE_INCLUDES使得条件表达式可以直接使用[a,b].includes(a)这类数组包含判断测试用例 testIncludes 对此做了验证恶意表达式拦截测试 testIllegalCondition 验证了java.lang.Runtime.getRuntime().exec(...)这类系统调用会在沙箱中抛异常被拒绝执行包括 Unicode 混淆形式。因此从代码层面看条件表达式被限制在安全沙箱内但作为使用者仍应避免在条件中拼接不受信任的外部输入。分支命中与默认分支分支决策的完整流程在 SwitchLogicTask.java 的start()/calculateSwitchBranch()中若条件列表为空直接进入默认分支否则按顺序遍历dependTaskList依次完成参数替换与求值某个条件命中结果为true则记录其nextNode并break结束循环全部条件都不满足nextBranch null进入默认分支nextNodecheckIfBranchExist校验目标分支节点必须存在于当前 DAG 中否则抛出 IllegalArgumentException最后将决策结果写回taskInstance的任务参数并标记任务成功由工作流引擎根据nextBranch继续调度下游节点。常见使用建议先连线再配分支创建 Switch 后务必先建立上下游依赖关系再配置 Condition 与 Branch flow否则下游任务无法出现在分支选项中。条件顺序即优先级多个 Condition 按配置顺序依次求值先命中的生效请把高优先级条件放在前面。默认分支兜底始终配置默认分支Branch flow避免所有条件未命中时工作流中断。数值与字符串写法区分字符串比较使用${var}A双引号包裹的 JS 字符串比较数值比较使用${var}1。参数替换阶段会自动为字符串参数补引号。优先级与参数上下文Switch 条件中变量来源包含全局参数与上游 OUT 输出涉及同名参数时的取值优先级请参考参数上下文与优先级相关文档见 Parameter Context。不要在条件中拼接不可信输入虽然底层使用 Nashorn 沙箱执行恶意系统调用会被拒绝但生产环境中仍建议保持条件表达式简单、可控。【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinscheduler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表