vlambda博客
学习文章列表

DLA如何像MySQL那样管理任务、kill Query等

一、背景介绍

Data Lake Analytics(简称DLA,控制台:openanalytics.console.aliyun.com)作为阿里云上数据湖分析产品,经常需要执行很多长时间运行的任务,有些还是通过异步方式(zhuanlan.zhihu.com/p/55)来提交的,并且长时间任务经常需要消耗较大的资源和成本,因此管理好这些长任务是必须的。

DLA一直在不断完善过程中,针对任务管理主要有以下几个命令,一一解读。

二、SHOW PROCESSLIST

在MySQL(dev.mysql.com/doc/refma)中,show processlist是为了查看server端中各个线程(或链接)上的运行情况:

mysql> show processlist\G

*************************** 1. row ***************************
Id: 16777224 -- 连接id
User: oa_1xxxxxxxxxx7597c -- dla账号
Host: 212.20.110.21:7320 -- 客户端的ip和port
db: tpch_50x_text -- 连接上绑定的schema(use database)
Command: SELECT -- 当前SQL类型
Time: 1 -- SQL执行实现
State: RUNNING -- SQL状态
Info: select count(*) from lineitem -- 实际的SQL
ProcessId: q201908070004sh0aa2bf4a0001009 -- ProcessId,用来排查各种问题的
1 row in set (0.08 sec)

因为JDBC/MySQL是BIO模式,且视角都是从连接出发,因此线程==连接。但是,在DLA中,因为支持异步执行,在同一时刻存在多个SQL在同一个连接上执行,所以展示的视角还是从Query出发,未来可以完全对齐MySQL的实现。

三、SHOW QUERY_TASK

在DLA中,show query_task主要查看SQL执行历史(当然,有一定的保存时间)以及其他相关信息,可以有多种方法来使用:

mysql> show query_task limit 1\G

*************************** 1. row ***************************
id: q201908070004sh0aa2bf4a0001009 -- ProcessId,用来排查各种问题的
mpp_query_id: 20190807_000457_162_dxdss -- 内部的执行引擎的id
status: SUCCESS -- SQL执行状态
task_name: SELECT
table_schema: tpch_50x_text
creator_id: oa_1xxxxxxxxxx7597c
create_time: 2019-08-07 00:04:58.0
update_time: 2019-08-07 00:05:00.0
connection_id: 16777224 -- 所在连接id
message: -- 出错时信息
row_count: 1 -- 返回数据行数
elapse_time: 2601 -- 消耗的时间(ms)
scanned_row_count: 300005316 -- 扫描行数
scanned_data_bytes: 39532662007 -- 扫描数据量(bytes)
result_file_oss_file: NULL -- 结果文件存储的oss地址
cancellable_task: 0
sub_query_count: 0
command: select count(*) from lineitem... -- 实际的命令,截断后的SQL
mq_product: NULL -- 如果有消息通知,如下都是消息相关
mq_model: NULL
mq_topic: NULL
mq_queue: NULL
mq_producer_id: NULL
mq_endpoint: NULL
mq_status: NULL
mq_error_msg: NULL
mq_message_id: NULL
mq_total_time: NULL
1 row in set (0.07 sec)

除了上面的用法,还有如下几种写法,方便使用:

-- 查看10条日志(默认按照create time倒排)
show query_task limit 10;

-- 查看08-07之前的数据
show query_task where create_time < '2019-08-07' limit 1;

-- 查看完整的SQL信息(谨慎使用)
show full query_task limit 1;

-- 直接通过一个ProcessId来查询某条记录,快速排查问题
show query_task where id = 'q201908070004sh0aa2bf4a0001009'

四、SELECT CONNECTION_ID()

如果想在SQL中了解当前connection的id,可以执行:

mysql> select connection_id();

+-----------------+
| connection_id() |
+-----------------+
| 16777234 |
+-----------------+
1 row in set (0.05 sec)

早期DLA还没有实现内部节点全局通信以及全局connection id分配机制,导致连接的id分配有问题,从而又导致各种kill命令不生效。不过最近通过内部的协调机制解决了这个问题,因此目前这个id是在DLA的分布式集群内是唯一的。

五、KILL CONNECTION/QUERY

在近期DLA实现了内部节点全局通信以及全局connection id分配机制之后,DLA的kill命令终于上线了。DLA尽可能靠近MySQL中kill(dev.mysql.com/doc/refma)的语法和语义来实现,帮助用户快速上手使用。主要有四种用法:

  • kill连接,包括连接上所有运行的同步和异步SQL,以及未来的SQL,同时客户端需要重连

kill [connection] 123456  -- 123456一定是链接的id才行(全数字的)
  • kill连接上的query,包括连接上所有运行的同步和异步SQL,但不包括后续的SQL,客户端也无需重连;

kill query 123456  -- 123456一定是链接的id才行(全数字的)
  • kill某个query,包括连接上所有运行的同步SQL和异步SQL,以及未来的SQL;总之,客户端一定要重连才行;

kill query q201908070025sh0aa2bf4a0003001  -- q2019...一定是Query的id才行
  • 在MySQL-cli等工具中,执行SQL后及时Ctrl+C,会自动发送kill query 命令:

mysql> select count(*) from lineitem join customer on  l_comment = c_comment;
^C^C -- query aborted
ERROR 30101 (HY000): ProcessId=q201908070025sh0aa2bf4a0003001, .... because Query was canceled

mysql> show query_task limit 2\G
*************************** 1. row ***************************
id: q201908070034sh0aa2bf4a0003540
status: SUCCESS
task_name: KILL
command: KILL QUERY 16777224... -- 这个是由MySQL-cli自动发送的命令
*************************** 2. row ***************************
id: q201908070025sh0aa2bf4a0003001
status: CANCELLED -- 这个状态改为CANCELLED
task_name: SELECT
table_schema: tpch_50x_text
elapse_time: 2370 -- 会正常统计时间
scanned_row_count: 40467370 -- 会统计行数,且会计费
scanned_data_bytes: 5569147189 -- 会统计行数,且会计费
command: select count(*) from lineitem join customer on l_comment = c_comment...
2 rows in set (0.05 sec)

另外,考虑到整个DLA的SQL引擎是一个分布式系统,有时候因为通信、延迟、调度等各种问题,不能及时kill掉SQL(比如时机太晚了)或者kill出错(比如SQL已经不存在了)时,请您理解。如果有非预期行为请及时反馈给DLA的开发同学。谢谢。

六、其他相关

其他文档:zhuanlan.zhihu.com/data