ecFlow笔记:ecFlow日志解析 - client 命令记录

目录

本文属于介绍 NWPC 工作流日志工具的系列文章。

之前的文章《ecFlow笔记:ecFlow日志解析 - 通用字段》介绍如何解析 ecFlow 日志的通用字段。

本文介绍如何解析 client 命令记录(ClientLogRecord)类型的 ecFlow 日志条目。

本文代码均来自 nwpc-oper/nwpc-workflow-log-model 项目。

介绍

client 命令记录主要包括记录不属于 child 子命令的 ecflow_client 命令调用,以及 UI 客户端与 ecflow 服务的通讯。

大部分 client 命令都与人工操作有关。例如对于某些无法完成的任务,需要值班员手动设为 complete 状态;大量任务出错补做时,可以使用 requeue aborted 命令。

目前 NWPC 工作流日志工具尚未关注 client 命令,所以仅做简单介绍。

示例

下面举例说明常用命令的日志。

节点命令

requeue

requeue 命令用于将所有任务重新排队,是最常用的维护操作之一。

默认情况下,requeue 会重新排队所有的子节点。 例如下面日志来自数据转码任务,转码任务出错后,重新排队 /grapes_tym_post/00/data/001 节点,该节点所有子任务会进入 queued 状态。 随后,根据依赖关系,pre_data2grib2 会立即被提交。

MSG:[06:58:28 26.5.2020] --requeue force /grapes_tym_post/00/data/001  :nwp_pd
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001/pre_data2grib2
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001/data2grib2
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001/orig_grib2
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001/fy4a_bin
LOG:[06:58:28 26.5.2020]  queued: /grapes_tym_post/00/data/001/cmacast
LOG:[06:58:28 26.5.2020]  submitted: /grapes_tym_post/00/data/001/pre_data2grib2 job_size:5232
LOG:[06:58:28 26.5.2020]  submitted: /grapes_tym_post/00/data/001

requeue 也支持仅排队出错的任务。 下面的日志将 /swfdp 下所有出错的绘图任务重新排队,符合依赖关系的任务会立即重新运行。

MSG:[17:41:09 28.5.2020] --requeue abort /swfdp  :nwp
LOG:[17:41:09 28.5.2020]  queued: /swfdp/12/deterministic/base_SEA/LOG:[17:41:09 28.5.2020]  queued: /swfdp/12/deterministic/base_SEA/102/SWFDP_SEA/WIND_barb_300hPa_SWFDP_SEA_sep_102
LOG:[17:41:09 28.5.2020]  queued: /swfdp/12/deterministic/base_SEA/102/SWFDP_SEA/WIND_barb_700hPa_SWFDP_SEA_sep_102
LOG:[17:41:09 28.5.2020]  queued: /swfdp/12/deterministic/base_SEA/102/SWFDP_SEA/WIND_barb_850hPa_SWFDP_SEA_sep_102
LOG:[17:41:09 28.5.2020]  queued: /swfdp/12/deterministic/base_SEA/102/SWFDP_SEA/TEMP_700hPa_SWFDP_SEA_sep_102

force

force 命令用于强制改变节点的状态。

当某个任务无法正常完成时,就需要将该任务强制设置为 complete,保证系统能正常滚动循环。 下面示例中 /meso_post/15/archive_cycle 任务因为拷贝和打包文件耗时太长,无法在业务时间段完成,所以强制设置为完成,并直接跳过该任务。

MSG:[18:06:49 28.5.2020] --force=complete /meso_post/15/archive_cycle  :nwp
LOG:[18:06:49 28.5.2020]  complete: /meso_post/15/archive_cycle

另外,force 也可以将任务强制设为其他状态。 下面示例中,/gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000/after_data2grib2_000 任务虽然处于 active 状态,但 slurm 中已找不到对应的作业。 所以通过强制设为 aborted 状态,让 ecflow 自动重新提交改作业

MSG:[21:59:51 28.5.2020] --force=aborted /gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000/after_data2grib2_000  :nwp
LOG:[21:59:51 28.5.2020]  aborted: /gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000/after_data2grib2_000 try-no: 1 reason: 
LOG:[21:59:51 28.5.2020]  aborted: /gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000
...
LOG:[21:59:51 28.5.2020]  submitted: /gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000/after_data2grib2_000 job_size:20758
LOG:[21:59:51 28.5.2020]  submitted: /gda_grapes_gfs_post/12/gfs_togrib2/grib2WORK/000

kill

kill 命令用于杀掉正在运行的任务

例如下面日志中,值班人员将因为某种原因卡住的任务手动杀掉。

MSG:[01:01:44 3.6.2020] --kill /grapes_meso_3km_post/18/upload/togrib2/upload_orig_grib2/upload_orig_grib2_026  :nwp_pd

suspend

suspend 命令将节点挂起,可以阻止节点的子节点提交任务,是维护的常用操作。

MSG:[04:43:36 20.5.2020] --suspend /grapes_tym_post/00/graph  :nwp_pd

resume

resume 命令用于恢复挂起的节点。

MSG:[04:44:50 20.5.2020] --resume /grapes_tym_post/00/graph  :nwp_pd

alter

alter 命令可以用于修改节点变量。

下面的示例将任务的运行队列修改为 serial_op

MSG:[21:45:41 28.5.2020] --alter change variable CLASS serial_op /env_grib_pi_v1_0/env_grib_pi/hbb/12/huanbaobu_postvar/grapes_meso_postvar  :nwp

delete

delete 命令用于删除节点,常用于删除 alias 别名任务。

MSG:[01:16:49 3.6.2020] --delete yes /grapes_meso_3km_post/18/upload/togrib2/upload_orig_grib2/upload_orig_grib2_000/alias0  :nwp_pd

free-dep

free-dep 命令用于临时删除触发关系。

可以删除所有的依赖关系

MSG:[21:54:02 28.5.2020] --free-dep all /env_grib_pi_v1_0/env_grib_pi/hbb/12  :nwp

也可以仅删除时间限制条件

MSG:[13:16:02 14.5.2020] --free-dep time /meso_post/06  :nwp

系统命令

load

load 命令用于将系统定义文件 *.def 加载到 ecFlow 中。

MSG:[02:39:20 18.5.2020] --load=grapes_meso_3km_post.def  :nwp_ex

replace

replace 命令用于更新 ecFlow 中已有的系统定义。

MSG:[01:52:27 20.5.2020] --replace=/grapes_tym_post grapes_tym_post.def parent  :nwp_pd

begin

第一次加载系统时,需要使用 beigin 命令让系统启动。

MSG:[00:32:50 4.6.2020] --begin=grapes_emer_v1_2 --force :nwp_pd

order

order 命令用于调整同级节点的顺序。

MSG:[13:04:50 21.5.2020] --order=/grapes_meso_3km_post/00/tograph/meso_radar down  :nwp_pd

建议在系统定义中设置好节点的顺序,order 命令仅用于临时调试。

结构

client 命令记录(ClientLogRecord)的结构继承自通用日志结构(EcflowLogRecord),将 Event 字段设置为状态变化 EventType.Chient。 同时增加命令(Command)字段,记录执行的命令。 对于不同的命令,在附加信息(Additional Information)字段中会记录额外的信息,例如:force 命令记录命令选项,begin 命令会额外记录系统名称。

Client 命令记录结构

解析

在经过通用解析后,从 command 字段中提取 client 命令设置为命令字段(Command),解析最后的用户字段(User)。并根据命令进行相应的解析。

部分命令需要额外解析选项(Option)和系统名称(Suite Name)等附加字段。

Client 命令记录解析

实现

请参考 nwpc-workflow-log-model 项目的 ClientLogRecord 类的 parse_record 函数

以下代码来自该函数,其中 self 表示 EcflowLogParser 类,line 是解析过通用字段后剩余的日志条目字符串。即

requeue force /grapes_reps_v3_2/00/control/model/fcst_monitor  :nwp_qu

解析命令

查找 " ",获取命令字段

start_pos = 0
end_pos = line.find(" ", start_pos)
event = line[start_pos:end_pos]

解析用户

从后往前查找 :,获取用户名

user_start_pos = line.rfind(":")
if user_start_pos == -1:
    if debug:
      logger.error(f"client record: user not found => {self.log_record}")
else:
    self.user = line[user_start_pos+1:].strip()

requeue 命令

获取节点路径和额外信息。

start_pos = end_pos + 1
tokens = line[start_pos:].split()
if len(tokens) >= 3:
    requeue_option = tokens[0]
    node_path = tokens[1:-1]
    if len(node_path) == 1:
        self.node_path = node_path[0]
    else:
        self.node_path = node_path
    self.additional_attrs["option"] = requeue_option

load 命令

获取定义文件路径

self.event = "load"
def_path = event[5:]
self.node_path = def_path
self.additional_attrs["def_path"] = def_path

begin 命令

获取系统名称和命令选项

self.event = "begin"
suite_name = event[6:]
self.node_path = suite_name
start_pos = end_pos + 1
self.additional_attrs["suite_name"] = suite_name
self.additional_attrs["option"] = line[start_pos:user_start_pos].strip()

其他命令

不再详细描述,感兴趣请看源代码。

参考

项目:

nwpc-oper/nwpc-workflow-log-model