MLSQL Console如何优化脚本级任务进度展示

2.1.0-SNAPSHOT 及以上版本可用

对于稍微长一点的任务一直转圈圈,会让用户比较焦虑。那么怎么展示任务进度呢? 对于脚本而言,要展示任务进度其实是挺困难的。原因有如下几个:

  1. 脚本是顺序执行的,脚本的每条语句在实际执行过程中,才能产生数量不等的Job,每个Job 由数量不等的stage/tasks组成。实际上没有执行到最后,我们是无法知道到底有多少Job需要执行的。

  2. 脚本里很多语句并不会触发真实的Job产生,只有那些属于Action的动作,才会产生,所以会导致每个语句的执行时间相差极大。

针对上面的问题,我们知道已经无法按传统的方式展示一个进度条。所以最后设计成了下面这个样子:

首先,系统在真正执行一个脚本之前,会先解析一遍脚本,将所有的Action(真正会触发Job的)语句提取出来。比如上面示例脚本提取了3个动作,两个save,以及最后一个load语句。

其次,在实际执行脚本的过程中,会注册一个监听器,得到当前正在执行的语句。

再次,我们会根据groupId,到底层引擎获取所有任务的执行情况。

这样,就可以形成一个二级结构:

  1. 系统实时告诉你当前正在执行第几个Action(语句)
  2. 当前这个语句的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;

results matching ""

    No results matching ""