MLSQL Console如何优化脚本级任务进度展示
2.1.0-SNAPSHOT 及以上版本可用
对于稍微长一点的任务一直转圈圈,会让用户比较焦虑。那么怎么展示任务进度呢? 对于脚本而言,要展示任务进度其实是挺困难的。原因有如下几个:
脚本是顺序执行的,脚本的每条语句在实际执行过程中,才能产生数量不等的Job,每个Job 由数量不等的stage/tasks组成。实际上没有执行到最后,我们是无法知道到底有多少Job需要执行的。
脚本里很多语句并不会触发真实的Job产生,只有那些属于Action的动作,才会产生,所以会导致每个语句的执行时间相差极大。
针对上面的问题,我们知道已经无法按传统的方式展示一个进度条。所以最后设计成了下面这个样子:
首先,系统在真正执行一个脚本之前,会先解析一遍脚本,将所有的Action(真正会触发Job的)语句提取出来。比如上面示例脚本提取了3个动作,两个save,以及最后一个load语句。
其次,在实际执行脚本的过程中,会注册一个监听器,得到当前正在执行的语句。
再次,我们会根据groupId,到底层引擎获取所有任务的执行情况。
这样,就可以形成一个二级结构:
- 系统实时告诉你当前正在执行第几个Action(语句)
- 当前这个语句的Job执行情况,比如总共有多少个task,已经完成多少个,多少个失败了,正在运行多少个。
这样,用户就可以知道哪个语句触发的查询消耗了多少资源,如果发现不对劲,可以及时cancel掉任务的执行,然后继续优化。
Bonus
MLSQL Engine大部分信息其实都可以通过MLSQL语法获取。实际上MLSQL Console也是通过调用下面的MLSQL的!show命令来获得信息展示在界面上。
获取当前脚本运行第几个语句的查询语法为:
!show "jobs/get/[jobName]";
获取当前脚本的详细Job任务情况:
!show "jobs/v2/[jobName]";
其中的映射规则如下:
return {
jobId: job.jobId,
duration: job.duration,
total: job.numTasks - job.numSkippedTasks,
numKilledTasks: job.numKilledTasks,
skipped: job.numSkippedTasks,
failed: job.numFailedTasks,
completed: job.numCompletedIndices,
started: job.numActiveTasks
}
let runningStr = ""
if (item.failed === 0 && item.skipped === 0 && item.started > 0) {
runningStr += `(${item.started} running)`
}
const percent = parseInt((item.completed / item.total * 100) + "")
return {
title: `${item.jobId}(${temp.groupId})`,
duration: duration,
tasks: `${item.completed}/${item.total}${runningStr}`,
progress: percent
}
展示当前引擎所有正在运行的任务:
!show jobs;