【PowerJob语雀转载】 任务与工作流配置

163 阅读14分钟

调度服务器与执行器部署完成后,录入任务或工作流信息即可正式开启调度。任务与工作流的配置可在前端页面完成(当然也可以通过 OpenAPI 完成)。本章将详细详细介绍 PowerJob 的主控(前端控制台 powerjob-console)的使用!

powerjob-console 的主要功能如下

  • 任务的配置与管理
  • 工作流的配置与管理(提供工作流在线编辑界面,简单易用)
  • 任务实例的监控,包括查看运行状态、详细运行时信息、在线日志等功能
  • 工作流实例的监控,包括查看整体的运行情况(上下游关系)、某个子任务实例的运行情况等
  • 任务实例的运维,允许开发者在线停止某个任务实例或运行某个任务
  • 工作流实例的运维,允许开发者在线停止、重试某个工作流实例或运行某个工作流
  • 容器模版的生成,一键生成容器 maven 项目,极大提升开发效率
  • 容器信息的配置与管理
  • 容器的在线运维,包括部署、监控等

以下为控制台的详细介绍和界面展示(由于内容较多,请善用搜索或大纲功能快速定位)。

系统首页

展示了系统整体的概览和集群 Worker 列表,同时提供服务器时间和本地时间的对比来确保调度的准确性。

请检查调度服务器时区、时间与本地浏览器时区、时间是否一致,不一致的情况下会导致调度无法准确进行!

任务管理

主界面

直观地展示当前系统所管理的所有任务信息,并提供相应的运维方法。

新增任务界面(教程,推荐仔细阅读)

点击右上角按钮新建任务,即可录入新的任务,具体界面和说明如下所示。

  • 任务名称:名称,便于记忆与搜索,无特殊用途,请尽量简短(占用数据库字段空间)
  • 任务描述:描述,无特殊作用,请尽量简短(占用数据库字段空间)
  • 任务参数:任务处理时能够获取到的参数(即各个Processor 的 process 方法入参 TaskContext 对象的 jobParams 属性)(进行一次处理器开发就能理解了)
  • 定时信息:该任务的触发方式,由下拉框和输入框组成
    • API -> 不需要填写任何参数,表明该任务由 OpenAPI 触发
    • CRON -> 填写 CRON 表达式(在线生成网站)。注意,PowerJob 出于性能考虑,目前强制设置了 15S 一次的调度频率,CRON 任务最短执行间隔为 15S,如果低于这个值,建议直接使用秒级任务。
    • 固定频率 -> 填写整数,单位毫秒
    • 固定延迟 -> 填写整数,单位毫秒
    • 每日固定间隔 -> 哪几天的哪些时间段需要执行,比如每周二和三的10点到11点间每10分钟触发一次
    • 工作流 -> 不需要填写任何参数,表明该任务由工作流(workflow)触发
  • 生命周期:定时策略生效的时间段
  • 执行配置:由执行类型(单机、广播和 MapReduce )、处理器类型和处理器参数组成,后两项相互关联。
    • 内置Java处理器
      • 方式一 -> 填写该处理器的全限定类名(eg, tech.powerjob.samples.processors.MapReduceProcessorDemo
      • 方式二 -> 填写 IOC 容器的 bean 名称,比如 Spring 用户可填写 Spring Bean 名称(eg, 处理器使用注解 @Component(value = "powerJobProcessor"),则控制台可填写 powerJobProcessor)
      • 方式三 -> 方法级注解,非 MapReduce 任务可直接使用注解 @PowerJobHandler 将某个方法转化为 PowerJob 任务,并设置唯一入参 TaskContext注入上下文,具体参考代码
@Component(value = "springMethodProcessorService")
public class SpringMethodProcessorService {

    /**
     * 处理器配置方法1: 全限定类名#方法名,比如 tech.powerjob.samples.tester.SpringMethodProcessorService#testEmptyReturn
     * 处理器配置方法2: SpringBean名称#方法名,比如 springMethodProcessorService#testEmptyReturn
     * @param context 必须要有入参 TaskContext,返回值可以是 null,也可以是其他任意类型。正常返回代表成功,抛出异常代表执行失败
     */
    @PowerJobHandler(name = "testEmptyReturn")
    public String testEmptyReturn(TaskContext context) {
        OmsLogger omsLogger = context.getOmsLogger();
        omsLogger.warn("测试日志");
        return "响应结果,正常返回视为执行成功,抛出异常视为执行失败"
    }
}
  • 运行配置
    • 派发策略:默认健康度优先,优先选择性能最优机器进行执行,可选随机均摊等其他派发模式
      • HEALTH_FIRST:默认策略,健康度优先,会选择 worker 集群中状态最好的机器作为本次任务的主节点
      • RANDOM:随机
      • SPECIFY:指定主节点运行,常用于 Map/MapReduce 等场景,大规模计算时,主节点部署/重启会导致任务完全失败,因此可为主节点搭建一个隔离环境,通过该参数指定主节点到该隔离环境运行,使其摆脱普通 worker 节点部署带来的影响。指定语法等同于“执行机器地址”的语法,填写 IP 或者 TAG。
    • 最大实例数:该任务允许同时执行的数量,0代表不限(默认为 0)
    • 单机线程并发数:该实例执行过程中每个 Worker 使用的线程数量(MapReduce 任务生效,其余无论填什么,都只会使用必要的线程数...)
    • 运行时间限制:限定任务的最大运行时间,超时则视为失败,单位毫秒,0 代表不限制超时时间(不建议不限制超时时间)。
  • 重试配置:
    • Instance 重试次数:实例级别,失败了整个任务实例重试,会更换 TaskTracker(本次任务实例的Master节点),代价较大,大型Map/MapReduce慎用。
    • Task 重试次数:Task 级别,每个子 Task 失败后单独重试,会更换 ProcessorTracker(本次任务实际执行的 Worker 节点),代价较小,推荐使用。
    • 注:请注意同时配置任务重试次数和子任务重试次数之后的重试放大,比如对于单机任务来说,假如任务重试次数和子任务重试次数都配置了 1 且都执行失败,实际执行次数会变成 4 次!推荐任务实例重试配置为 0 ,子任务重试次数根据实际情况配置。
  • 机器配置:用来标明允许执行任务的机器状态,避开那些摇摇欲坠的机器,0 代表无任何限制。
    • 最低 CPU 核心数:填写浮点数,CPU 可用核心数小于该值的 Worker 将不会执行该任务。
    • 最低内存(GB):填写浮点数,可用内存小于该值的 Worker 将不会执行该任务。
    • 最低磁盘(GB):填写浮点数,可用磁盘空间小于该值的 Worker 将不会执行该任务。
  • 集群配置
    • 执行机器地址,指定集群中的某几台机器执行任务
      • IP模式:多值英文逗号分割,如192.168.1.1:27777,192.168.1.2:27777。常用于 debug 等场景,需要指定特定机器运行。
      • TAG 模式:通过 PowerJobWorkerConfig#tag将执行器打标分组后,可在控制台通过 tag 指定某一批机器执行。常用于分环境分单元执行的场景。如某些任务需要屏蔽安全生产环境(tag 设置为环境标),某些任务只需要在特定单元执行(tag 设置单元标)
    • 最大执行机器数量:限定调动执行的机器数量
  • 报警配置:
    • 选择任务执行失败后报警通知的对象,需要事先录入。
    • 对于秒级任务,支持分别指定错误阈值(C)、统计窗口(S)、沉默窗口(W) 来定制更加丰富的告警机制(表示的是在 S 秒内失败次数达到 C 次就触发告警,并且沉默 W 秒)
  • 日志配置:可使用控制台配置调整 Job 使用的 Logger 及 LogLevel
    • 支持 SERVER(服务端日志,默认)、LOCAL(本地日志)、STDOUT(系统输出)、NULL(空实现)4种 LogType
    • 支持 DEBUG、INFO、WARN、ERROR、OFF 5种级别控制
    • 使用建议:初期调试可使用 SERVER 日志,后续功能稳定后改为 LOCAL,并调高日志级别,降低通讯压力,消除性能瓶颈问题
  • 高级设置
    • TaskTracker 行为:
      • NORMAL:常规行为。不特殊处理,TaskTracker 正常参与集群计算,会导致其负载比常规节点高。适用于节点数不那么多,任务不那么繁重的场景。
      • PADDLING:划水:只负责管理节点,不参与计算,稳定性最优。适用于节点数量非常多的大规模计算场景,少一个计算节点来换取稳定性提升。

复制任务

移动到更多,点击复制即可一键复制指定任务 ~

参数运行

支持运行任务时手动指定实例参数

任务实例

直观地展示当前系统中运行任务实例的状态,点击详情即可获取详细的信息,点击日志可以查看通过 omsLogger 上报的日志,点击停止则可以强制终止该任务。

主界面

  • 普通任务实例 TAB 显示由 PowerJob 直接调度的任务实例。
  • 工作流任务实例 TAB 显示由 PowerJob 调度的工作流内运行的子任务实例。

任务实例详情

点击详情按钮,可查看任务实例的详细运行时信息。


4.3.8 及后续版本,针对 Map/MapReduce 任务,支持

在线日志

点击日志按钮,可查看任务实例的在线日志。

工作流

主界面

直观地展示当前系统所管理的所有工作流信息,并提供相应的运维方法。

新增工作流(教程,推荐仔细阅读)

此处为语雀视频卡片,点击链接查看:workflow_edit_demo_v4.0.0.mp4

点击右上角按钮 新建工作流,即可录入新的工作流,具体界面和说明如下所示。

  • 工作流名称:名称,无实际业务用途,请尽量精简字段
  • 工作流描述:描述,无实际业务用途,请尽量精简字段
  • 定时信息:该工作流的触发方式的触发方式,包含时间表达式类型选择框和时间表达式输入框
    • CRON -> 填写 CRON 表达式(在线生成网站
    • API -> 不需要填写任何参数,表明该任务由 OpenAPI 触发
  • 生命周期:定时策略生效的时间段
  • 最大实例:该工作流同时执行的数量

  • 任务依赖关系: 提供编辑界面可视化操作,绘制 DAG(有向无环图),配置工作流内各个任务的依赖关系

DAG 操作指南

编辑依赖关系

v4.0.0 以后支持节点的自由拖拉拽,不用再点点点了,哈哈哈 ~

  • 添加节点:点击 DAG 编辑框左上方的 “导入任务”,导入当前存在的任务(需要提前在 任务管理界面 录入任务),生成 DAG 的节点

  • 连接节点:点击起始节点的任意一个锚点摁住不放,拖动鼠标连接到另一个节点的任意一个锚点即可

  • 删除节点:选中需要删除的节点,按退格键( 注意:windows 下使用退格键 [Backspace],macOS 下使用删除键 [delete]

  • 删除边:选中需要删除的边,按退格键( 注意:windows 下使用退格键 [Backspace],macOS 下使用删除键 [delete]

编辑节点信息

点击需要编辑的节点,在右侧会弹出一个编辑框,如下图所示

  • 任务名称: 当前节点引用的任务名称,点击可编辑(支持输入名称进行模糊搜索)

  • 节点名称:节点的名称,无实际业务用途,在能明确表示节点背后的业务逻辑的情况下请尽量精简字段

  • 节点参数:节点的参数配置,当这个信息不为空的时候使用这个参数覆盖当前节点所引用的任务所配置的参数信息

  • 是否启用:未启用的节点将会直接跳过

  • 失败跳过: 当这个节点执行失败的时候不会打断整个工作流的执行

特殊节点说明

判断节点

判断节点 不允许失败跳过以及禁用,节点参数中存储的是 Groovy 代码(执行 Groovy 代码时会将当前工作流上下文作为 context 变量注入到代码执行的上下文中),其执行结果仅能返回 "true" 或者 "false",同时判断节点仅有且必须有两条“输出”路径。会根据该代码的执行结果决定下游需要执行的节点。这里处理的原则是, 仅 cancel 那些只能通过被 disable 掉的边可达的节点

举个两个栗子,灰色代表相应的边 或者 节点被 disable 或 cancel,菱形代表判断节点,假定执行结果为 true

case 3 以及 case 4 中的节点 3 都会被 cancel ,因为它只能通过节点 1 -> 节点 3 的边可达(该边的属性为 false),但对于节点 5 而言,在 case 4 中因为判断节点 2 的执行结果为 true ,那么其可以通过节点 2 -> 节点 5 的边可达,所以不会被 disable 。

备注:如果需要根据上游节点的执行结果决定下游节点,可以将上游节点的执行结果注入上下文中,再在判断节点中做相应的判断。

工作流嵌套节点

该节点代表对某个工作流的引用,节点的 jobId 属性存储的是工作流 id,其他属性和普通的任务节点一致。不允许出现循环引用以及多级嵌套的情况,即嵌套节点中指向的工作流一定是一个不含嵌套节点的工作流。

执行到该节点时,如果该节点处于启用状态,那么将启动该节点所引用工作流的一个新实例,待该实例执行完成后再同步更新该节点的状态。

注意,创建子工作流时,会透传当前的上下文作为工作流的实例参数,在子工作流执行完成时会合并子工作流的上下文至父工作流的上下文中。

重试子工作流不会联动重试父工作流,但失败的子工作流会随着父工作流的重试而原地重试(不会生成新的实例)

复制工作流

如果需要配置一个和现有工作流相似度很高的工作流,墙裂建议使用工作流的复制功能,省时又省心 ~ 😎

点击复制按钮即可 ~

工作流实例

v4.0.0 版本大幅提升了工作流的运维能力 !😎

主界面

工作流实例详情

其中上方为工作流实例的基础信息,下方为实例的 DAG 信息,点击节点可以查看对应的任务实例详情信息。

右上方有三个功能按钮用于工作流的运维

刷新: 重新获取当前工作流实例的信息

重试:从当前工作流实例失败(会忽略失败跳过的节点)的节点开始继续往后执行

停止尝试停止当前工作流实例中所有正在执行的任务,并终止整个工作流

DAG 界面左侧上方还有个相对比较隐蔽的功能按钮 📌 标记成功,如下图所示

选中执行失败的节点,点击标记成功后会将其 DAG 中的节点状态置为成功(不会更改对应任务实例的状态,所以点击节点看到的任务实例详情还是失败)

该功能主要用于搭配工作流实例的重试功能实现灵活运维 (想跳过某个失败的节点进行重试)。