运行与调试¶
工作流发布后,每次运行都会产生工作流作业。本页说明如何从工作流作业定位失败,并列出常见的失败成因与处理方式。排查建立在工作流页的前提之上:调度引擎按定义执行、不校验任务语义,因此失败既可能来自定义,也可能来自某个算子的执行。
从工作流作业入手¶
一次运行按输入文件扇出为多条工作流作业,每个文件一条。每条记录包含各算子的执行状态、输入、输出与日志。
排查从第一个失败算子的工作流作业开始:
定位状态为失败的算子。
查看该算子的输入:是否取到了预期的值,字段是否符合该算子的约定。
查看该算子的日志:执行问题的原因通常记录在此。
若该算子的输入已经不对,问题多在其上游或定义,而非该算子本身。
先分两类问题¶
定位失败前,先判断问题属于哪一类——两类的修复位置不同。
类别 |
表现 |
修复位置 |
|---|---|---|
定义问题 |
算子选择、执行顺序或参数绑定错误;引擎照定义原样执行 |
修改工作流定义 |
执行问题 |
定义正确,某算子对合法输入处理失败 |
查看该算子工作流作业中的日志 |
一份能保存、能启动的工作流,不代表定义正确。定义问题不会在保存或启动时报错,只在运行中显现。
常见失败与成因¶
现象 |
成因 |
处理 |
|---|---|---|
算子持续等待,不报错也不结束 |
算子引用的算子未在工作区注册(名称拼写、版本不符,或该算子当前无可用实例) |
以 |
算子报输入缺失或取值为空 |
下游模板引用的键,上游未用 |
核对上游 |
画布显示与实际执行不一致 |
局部编辑改动了其他算子的绑定 |
发布前用“预览 DSL”核对整份定义 |
子工作流合并失败 |
不支持跨工作流引用或合并,工作流之间不共享状态、无数据通道 |
在同一份工作流定义内声明子网 |
需要文件内容的算子取不到正文 |
工作流数据只传文件引用,不传文件正文;读取正文的算子已禁用 |
由算子凭文件引用自行读取正文 |
SQL 算子执行失败 |
SQL 算子的输入仅为 SQL 语句本身,不接受自然语言 |
检查 SQL 语句本身;详见 SQL 编辑器 |
备注
算子引用未注册的算子时,运行不会报错,该算子持续等待。这类失败在工作流作业中表现为算子长期停留在等待状态,而非报错退出——排查时优先核对算子名称是否与工作区实时清单一致。
小技巧
在画布上完成局部编辑后,发布前用“预览 DSL”通读整份定义。画布是定义的一种编辑入口,局部操作可能改动其他算子的绑定;以 DSL 为准核对,可在运行前发现定义问题。