ARTICLE DETAIL

资讯详情

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

Apache DolphinScheduler Shell 任务(Shell Task)完全指南:创建、参数配置与底层执行原理

Apache DolphinScheduler Shell 任务(Shell Task)完全指南:创建、参数配置与底层执行原理 Apache DolphinScheduler Shell 任务Shell Task完全指南创建、参数配置与底层执行原理【免费下载链接】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 官方文档中 Shell 任务章节 为主体系统讲解 Shell 任务的定义、创建步骤、任务参数、实战示例与注意事项并结合当前仓库中dolphinscheduler-task-plugin/dolphinscheduler-task-shell模块的源码与测试用例深入剖析 Shell 脚本在 Worker 上如何生成、以何种用户身份执行、如何传递自定义参数、如何识别并管理 YARN 任务等底层机制。阅读完成后你将能够在 DolphinScheduler 中熟练创建、配置和排障 Shell 任务并理解其执行链路。一、Shell 任务概述Shell 任务类型用于创建 Shell 类型的任务节点执行一段或多段 Shell 脚本。根据官方文档描述当 Worker 执行该任务时会生成一个临时 Shell 脚本并使用与租户同名的 Linux 用户来执行。这一行为在当前仓库源码中得到印证。任务执行器 ShellTask.java 的handle()方法中通过ShellInterceptorBuilderFactory.newBuilder()构建 Shell 执行器并拼接原始脚本后交给ShellCommandExecutor运行而真正的进程启动逻辑位于 AbstractCommandExecutor.java其中明确设置了runUser(taskRequest.getTenantCode())——即以任务所属租户对应的 Linux 用户身份启动进程仅 Linux 生效。Shell 任务的参数模型定义在 ShellParameters.java核心字段只有两个rawScript原始脚本内容和resourceList资源文件列表参数校验规则为脚本非空。二、创建 Shell 任务创建入口与所有其他任务类型一致遵循标准的 DAG 编排流程点击项目管理 - 项目名称 - 工作流定义进入工作流定义页面点击创建工作流按钮进入 DAG 编辑页面从左侧工具栏中拖拽 Shell 图标到画布上在弹出的任务编辑对话框中填写脚本内容与各项参数保存并上线。创建完成后任务节点即成为工作流 DAG 中的一个节点可与其他任务节点建立上下游依赖关系Predecessor Task参与整个工作流的调度与编排。三、任务参数说明3.1 默认任务参数Shell 任务同样包含 DolphinScheduler 各任务类型共用的默认参数完整清单见 DolphinScheduler 任务参数附录。常用的默认参数及其含义如下参数说明节点名称任务节点名称同一工作流内节点名称必须唯一运行标志是否参与调度执行不需要执行时可打开禁止执行开关描述描述该节点的功能任务优先级Worker 线程数不足时按优先级执行任务优先级相同则遵循先来先服务Worker 分组执行任务的机器选择default时由调度器随机分发到某个 Worker任务组名称任务资源组未配置则不生效环境名称任务执行所需的环境失败重试次数任务失败后的重试次数可下拉选择或手动填写失败重试间隔失败重试的时间间隔CPU 配额为任务分配指定的 CPU 时间配额百分比默认 -1 表示不限最大内存任务可使用的最大内存MB超限触发 OOM 被 kill 且不自动重试默认 -1 表示不限超时告警任务超过超时阈值后发送告警邮件延时执行时间任务延迟执行的分钟数资源任务节点使用的资源文件前置任务当前任务节点的上游任务其中 CPU 配额与最大内存的启用需要配合 task.resource.limit.state 配置项开启资源限制。3.2 Shell 专属参数参数说明脚本Script用户编写的 SHELL 程序为必填项是任务执行的主体内容自定义参数User-defined parameterShell 的自定义参数会在脚本执行时替换脚本中的${variable}占位符从源码角度ShellParameters.checkParameters()仅校验rawScript非空而自定义参数在handle()中通过ParameterUtils.convert(taskRequest.getPrepareParamsMap())转换为执行器属性注入见 ShellTask.java。因此脚本是唯一必填参数自定义参数是可选的动态化手段。四、任务示例4.1 示例一打印一行日志该示例用于演示如何用一行或多行简单命令模拟轻量任务在任务日志中输出一行内容。在脚本输入框中填写echo hello world保存并运行任务后打开任务实例的日志可以看到脚本的执行结果被实时采集并写入任务日志。从源码看Worker 通过 AbstractCommandExecutor.java 中的collectProcessLog异步读取进程标准输出逐行写入日志并做参数解析因此echo输出会立即出现在任务日志中。4.2 示例二使用自定义参数该示例演示 Shell 任务的参数化复用能力。为了更方便地复用已有脚本、应对动态化需求通常使用变量保证脚本的可复用性。操作步骤如下在自定义参数区域定义参数param_key将其值设置为param_val在脚本中声明echo命令打印${param_key}保存并运行任务后任务日志中会输出参数param_key对应的值param_val。脚本内容示例echo param_key${param_key}DolphinScheduler 会在脚本执行前将${param_key}替换为实际配置的值从而实现脚本模板化同一脚本配合不同参数可服务多个场景。值得说明的是Shell 任务的自定义参数与任务的**出参输出参数**是两套机制。测试用例 ShellParametersTest.java 验证了dealOutParam的行为当任务声明了Direct.OUT类型的局部参数时执行器会从日志中解析出参并写入varPool供下游任务引用。测试同时覆盖了任务无输出参数时保留默认值、任务输出参数覆盖默认值两种场景这印证了 Shell 任务支持将脚本运行结果通过日志协议回传给下游节点。五、Shell 任务执行链路源码级原理为了帮助排障与深度使用这里梳理 Shell 任务从提交到结束的完整调用链任务通道创建Worker 端通过 ShellTaskChannel.java 的createTask()创建ShellTask实例并通过parseParameters()将 JSON 格式的任务参数反序列化为ShellParameters参数初始化ShellTask.init()解析参数并调用checkParameters()校验脚本为空则抛出TaskException脚本执行handle()构建IShellInterceptorBuilder依次注入预处理参数、系统环境变量ShellUtils.ENV_SOURCE_LIST、自定义环境脚本environmentConfig、K8s 配置、sudo 模式、租户用户、CPU 配额与内存配额最终build()后执行进程见 AbstractCommandExecutor.java日志采集与超时控制collectProcessLog异步读取进程输出并解析出参同时按getRemainTime()计算剩余时间process.waitFor(remainTime, TimeUnit.SECONDS)等待进程结束超时则判定失败EXIT_CODE_FAILURE结果回写任务退出码写入TaskResponsedealOutParam处理出参到varPool供工作流下游任务使用取消支持cancel()调用shellCommandExecutor.cancelApplication()会先尝试 kill 进程树再尝试取消 YARN/K8s 应用见 AbstractCommandExecutor.java。六、注意事项6.1 YARN 任务识别与管控Shell 任务类型会解析任务日志中是否包含application_xxx_xxx格式的内容来判断当前是否为 YARN 任务若日志中包含该格式的application_idDolphinScheduler 会将其用于判断当前 Shell 节点的运行状态此时如果停止工作流运行对应的application_id所代表的 YARN 应用也会被一并 kill。该行为的正则定义位于 TaskConstants.javaYARN_APPLICATION_REGEX application_\\d_\\d。应用 ID 的提取由 LogUtils.java 负责支持两种获取方式默认从任务日志文件中正则匹配当配置fetchWay为aop时则改从appInfo文件中读取。对应的取消逻辑在 ProcessUtils.java 中通过YarnApplicationManager调用killApplication完成。因此若你的 Shell 脚本会通过yarn命令提交 Spark/Flink/MapReduce 等 YARN 应用务必保证脚本输出或日志文件中能正确打印application_...形式的 ID以便 DolphinScheduler 准确跟踪应用状态反之如果脚本中出现了形如application_xxx_xxx的无关字符串也可能被误判为 YARN 应用需要注意规避。6.2 资源文件的使用如果需要在 Shell 任务中使用资源文件可以通过资源中心上传对应文件然后在任务节点中关联使用。具体操作请参考 文件管理。从参数模型看ShellParameters.resourceListListResourceInfo正是任务节点所关联的资源文件列表Worker 执行前会将其下发到任务执行目录供脚本引用。七、小结Shell 任务作为 DolphinScheduler 中最基础、最灵活的任务类型覆盖了从简单命令到复杂脚本编排的各类场景。理解其以租户同名 Linux 用户执行临时脚本的执行模型、${variable}参数替换机制、application_xxx_xxx的 YARN 任务识别规则能够帮助你在实际项目中更好地设计脚本、规避误判风险并在出现问题时快速定位到 ShellTask.java、AbstractCommandExecutor.java 等关键源码节点实现从会用到懂原理的进阶。【免费下载链接】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),仅供参考
返回列表