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 命令会额外记录系统名称。
解析
在经过通用解析后,从 command 字段中提取 client 命令设置为命令字段(Command),解析最后的用户字段(User)。并根据命令进行相应的解析。
部分命令需要额外解析选项(Option)和系统名称(Suite Name)等附加字段。
实现
请参考 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()
其他命令
不再详细描述,感兴趣请看源代码。
参考
项目: