ARTICLE DETAIL

资讯详情

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

Apache DolphinScheduler 参数优先级深度解析:六类参数来源与同名覆盖规则实战

Apache DolphinScheduler 参数优先级深度解析:六类参数来源与同名覆盖规则实战 Apache DolphinScheduler 参数优先级深度解析六类参数来源与同名覆盖规则实战【免费下载链接】dolphinschedulerApache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code项目地址: https://gitcode.com/GitHub_Trending/dol/dolphinschedulerDolphinScheduler 中的参数值可能来自内置参数、项目级别参数、全局参数、启动参数、上游任务传递参数与本地参数六种渠道当参数名相同时系统通过一套明确定义的优先级规则决定最终生效值。本文以官方文档《参数优先级》为主体结合仓库源码与完整示例讲清从高到低的优先级顺序、上游同名参数的特殊裁定逻辑以及如何在 Shell、SQL 等节点中验证这些规则帮助你在复杂 DAG 中精确控制参数取值。参数的六种来源DolphinScheduler 中所涉及的参数值可能来自以下六种类型参数类型定义位置作用域说明参考文档内置参数系统内置系统运行时自动注入如调度时间、任务实例 ID内置参数项目级别参数项目管理页面针对整个项目下的所有任务节点有效项目级别参数全局参数工作流保存页面IN 方向对整个工作流所有节点有效OUT 方向作为工作流输出参数传递给父流程全局参数启动参数工作流启动页面针对整个工作流的所有任务节点有效每次运行时可改动启动参数上游任务传递的参数上游节点输出通过方向为 OUT 的自定义参数向下游单向传递参数传递本地参数节点“自定义参数”默认仅限当前任务OUT 方向可向下游传递本地参数其中上游任务传递的参数本质上就是由 本地参数 中方向为 OUT 的变量演化而来任务执行期间 DolphinScheduler 捕捉日志中的${setValue(keyvalue)}Shell、Python、SQL 等节点或${(keyvalue)}/#{(keyvalue)}Kubernetes 节点等通用日志格式输出将值写入 OUT 参数并随 DAG 依赖关系传递到下游。因此六类来源并非彼此孤立而是存在天然的血缘关系。参数优先级规则由于参数值存在多个来源当参数名称相同时就会存在参数优先级的问题。DolphinScheduler 参数的优先级从高到低为上游任务传递的参数 启动参数 本地参数 全局参数 项目级别参数 内置参数即当同名参数同时存在时上游任务传递的参数取值最高其次依次是启动参数、本地参数、全局参数、项目级别参数内置参数优先级最低。例如节点内本地参数与上游传递参数同名时本地参数的值会被丢弃生效的是上游传递过来的值而全局参数、启动参数同样无法覆盖上游传递的参数。上游同名参数的特殊裁定在上游任务传递的参数中由于上游可能存在多个任务向下游传递参数当上游传递的参数名称相同时遵循以下两条规则下游节点会优先使用值为非空的参数如果存在多个值为非空的参数则按照上游任务的完成时间排序选择完成时间最晚的上游任务对应的参数。这一规则在仓库源码中有直接对应实现。任务执行结束后OUT 方向参数会以Property包含 prop、direct、value 等字段的形式序列化进任务上下文中的varPool列表见 TaskExecutionContext.java 与 AbstractParameters.java。当下游节点收集多个上游节点的 varPool 时由 VarPoolUtils.mergeVarPool 完成合并其源码注释明确写道当两个 varPool 中出现同名prop 与 direct 均相同的属性时后合并进来的 varPool 中的值生效。由于完成时间越晚的上游任务其 varPool 越晚被合并最终胜出的自然就是“完成时间最晚的上游任务对应的参数”与文档规则完全吻合。补充说明上游参数传递行为在 3.3.0 版本起存在行为差异——旧版本≤ 3.2.2中下游节点无需配置 IN 类型局部变量即可直接获取上游 OUT 类型输出新版本≥ 3.3.0中只有下游节点配置了 IN 类型的局部变量才可使用上游节点传递来的同名 OUT 输出详见 参数传递。这意味着“同名覆盖”的优先级裁决以成功进入下游节点变量空间为前提。参数占位符的解析顺序从源码层面看参数优先级最终落地在占位符替换阶段。ParameterUtils.convertParameterPlaceholders 的流程为先用PlaceholderUtils.replacePlaceholders替换${}形式的系统变量与自定义变量再用dateTemplateParse替换$[...]形式的时间衍生参数。也就是说任务实际运行时系统会先把六类来源按优先级合并成一个参数键值映射再统一对脚本中的${key}做替换——最终生效值唯一同名参数在进入替换阶段前已经通过优先级裁定完成去重。示例一Shell 节点验证“上游传递 本地参数”下面的示例展示任务参数优先级的使用先以 Shell 节点解释第一种情况。上图 DAG 中包含三个 Shell 节点createParam与noCreateParam并行useParam依赖createParam与noCreateParam无依赖关系。节点useParam可以使用到节点createParam中设置的变量而节点useParam与节点noCreateParam之间没有依赖关系所以并不会获取到节点noCreateParam的变量。上图中只是以 Shell 节点作为例子其他类型节点具有相同的使用规则。节点createParam创建了一个名为key1的输出OUT参数并将其赋值为1节点useParam创建了两个分别名为key1和key2的参数其中key1与上游节点传递的参数同名并被赋值为11然而根据优先级规则该节点内部本地参数的值11会被丢弃最终生效的赋值将是上游节点传递过来的值1。这正是“上游任务传递的参数 本地参数”的直接体现。示例二Shell SQL 节点组合验证完整优先级链我们再以 Shell 和 SQL 节点来解释复杂的组合案例。工作流 DAG 结构如下createParam1与createParam2并行执行后共同汇入 SQL 节点useParam。各节点与工作流的参数定义以下是节点createParam1的定义创建了一个名为id的输出OUT参数并将其赋值为11。以下是节点createParam2的定义同样创建了一个名为id的输出OUT参数并将其赋值为22该节点中加入了sleep 20的逻辑以确保它在节点createParam1之后执行完成。id同时是一个项目级参数其被赋值为1以下是节点useParam的定义id也是该节点自身的参数由当前节点赋值为3即本地参数此外用户在保存流程定义时也设置了id参数全局参数并将其赋值为2id还可以在任务启动页面上进行配置启动参数并将其赋值为4同名参数的逐层覆盖推演至此同名参数id同时出现在六个环节中各自的取值与优先级如下参数来源取值优先级是否生效内置参数—无同名最低不参与项目级别参数1低被覆盖全局参数2中被覆盖本地参数useParam 节点内3高被覆盖启动参数4更高被覆盖上游传递createParam1 为 11createParam2 为 2211 / 22最高生效由于上游createParam1与createParam2传出了同名的id依据“完成时间最晚者胜出”的规则加入sleep 20的createParam2后完成其值22最终胜出。执行结果验证执行结果符合预期其中参数上下文Parameter Context即上游任务传递的参数具有最高优先级。用户为节点createParam1和节点createParam2设置了同名参数id而节点useParam使用了后执行完成的节点createParam2的值22从useParam节点的执行日志可以清楚看到完整链路节点初始化时记录的localParams中id为3但 SQL 实际执行时参数已被替换为22日志中sql parameters: (id:INTEGER, value22)最终执行的 SQL 为SELECT id, name FROM t_ds_project WHERE id 22并成功查询出对应记录——这从运行结果侧印证了参数上下文上游传递参数的优先级高于本地参数、全局参数与启动参数。实战要点与常见误区基于上述规则与示例在使用多来源参数时建议注意以下几点同名是唯一触发优先级机制的条件只要各来源参数名不同它们会全部进入参数空间共存互不干扰只有参数名相同时才触发“高优先级覆盖低优先级”的裁定。上游传递参数并非天然可用3.3.0 及以后版本中下游节点需要显式声明 IN 类型的同名局部变量才能接收上游 OUT 参数并参与优先级裁定详见 参数传递。无依赖关系则不传递若节点之间没有依赖关系局部参数无法通过上游传递示例一中noCreateParam的变量正是因此无法被useParam使用。多上游同名参数以完成为准需要“后来者覆盖”时可在较晚上游节点加入sleep等延时逻辑控制完成顺序需要“先来者优先”时则要避免在多个上游同时定义同名 OUT 参数。OUT 才能向外传递本地参数只有方向为 OUT 时才会被定义为变量输出到下游方向为 IN 的参数即便在上游被赋值也不会进入下游变量空间参见 本地参数 与 参数传递 中的value参数示例。启动参数与全局参数面向全流程两者均可被任一节点的局部参数引用若需在每次运行时动态调整取值应优先使用 启动参数固定不变的全流程取值则用 全局参数。掌握以上优先级规则就能在构建多任务、多来源参数的复杂工作流时快速判断最终生效的参数值避免因同名参数覆盖而产生不符合预期的调度结果。【免费下载链接】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),仅供参考
返回列表